Мисля, че в повечето случаи разликите между тези две ще бъдат достатъчно малки, че изборът трябва да се ръководи най-вече от избора на реализация, която в крайна сметка е най-разбираема за някой, който гледа кода за първи път.
Въпреки това мисля, че обработката на изключения има няколко малки предимства:
-
Обработката на изключения избягва потенциално състояние на състезанието. Методът „проверете, след това вмъкнете“ може да се провали, ако друг процес вмъкне запис между вашата проверка и вмъкването. Така че, дори и да правите „проверете, след това вмъкнете“, вие пак искате обработка на изключения във вмъкването и ако така или иначе вече извършвате обработка на изключения, можете също да премахнете първоначалната проверка.
-
Ако вашият код не е съхранена процедура и трябва да взаимодейства с базата данни през мрежата (т.е. приложението и db не са в една и съща кутия), тогава искате да избегнете две отделни мрежови повиквания (едно за проверка и друго за вмъкването) и това чрез обработка на изключения осигурява лесен начин за обработка на цялото нещо с едно мрежово повикване. Сега има много начини да направите метода „проверете и след това вмъкнете“, като същевременно избягвате второто мрежово повикване, но простото улавяне на изключението вероятно ще бъде най-простият начин да направите това.
От друга страна, обработката на изключения изисква уникално ограничение (което наистина е уникален индекс), което идва с компромис с производителността:
- Създаването на уникално ограничение ще бъде бавно при много големи таблици и ще доведе до спад в производителността при всяко отделно вмъкване в тази таблица. При наистина големи бази данни трябва да предвидите и допълнителното дисково пространство, консумирано от уникалния индекс, използван за налагане на ограничението.
- От друга страна, това може да направи избора от таблицата по-бърз, ако вашите заявки могат да се възползват от този индекс.
Бих искал също да отбележа, че ако сте в ситуация, в която това, което всъщност искате да направите, е „актуализиране на вмъкване на друго“ (т.е. ако вече съществува запис с уникалната стойност, тогава искате да актуализирате този запис, в противен случай вмъквате нов запис), тогава това, което всъщност искате да използвате, е методът UPSERT на вашата конкретна база данни, ако има такъв. За SQL Server и Oracle това би било оператор MERGE.