La tua ipotesi è giusta, questo è il modo ottimale per farlo e si chiama upsert/merge.
Importanza di UPSERT - da sqlservercentral.com:
Per ogni aggiornamento nel caso sopra menzionato, stiamo rimuovendo una lettura aggiuntiva dalla tabella se utilizziamo UPSERT invece di EXISTS. Sfortunatamente per un Insert, entrambi i metodi UPSERT e IF EXISTS utilizzano lo stesso numero di letture sulla tabella. Pertanto il controllo dell'esistenza dovrebbe solo essere fatto quando c'è un motivo molto valido per giustificare l'I/O aggiuntivo. Il modo ottimizzato per fare le cose è assicurarsi di avere meno letture possibili sul DB.
La strategia migliore è tentare l'aggiornamento. Se nessuna riga è interessata dall'aggiornamento, inserisci. Nella maggior parte dei casi, la riga esiste già e sarà necessario un solo I/O.
Modifica :Controlla questa risposta e il post del blog collegato per conoscere i problemi con questo modello e come renderlo sicuro.