Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Ograniczenie UNIQUE a sprawdzanie przed INSERT

Myślę, że w większości przypadków różnice między tymi dwoma będą na tyle małe, że wybór powinien być głównie oparty na wyborze implementacji, która jest najbardziej zrozumiała dla kogoś, kto pierwszy raz patrzy na kod.

Myślę jednak, że obsługa wyjątków ma kilka małych zalety:

  • Obsługa wyjątków pozwala uniknąć potencjalnego wyścigu. Metoda „sprawdź, a następnie wstaw” może się nie powieść, jeśli inny proces wstawi rekord między sprawdzeniem a wstawieniem. Tak więc, nawet jeśli robisz „sprawdź, a następnie wstaw”, nadal chcesz obsługiwać wyjątki we wstawianiu, a jeśli już i tak robisz obsługę wyjątków, możesz równie dobrze zrezygnować z wstępnego sprawdzania.

  • Jeśli twój kod nie jest procedurą składowaną i musi komunikować się z bazą danych za pośrednictwem sieci (tj. aplikacja i baza danych nie znajdują się na tym samym polu), to chcesz uniknąć dwóch oddzielnych wywołań sieciowych (jedno do sprawdzenia i inne dla wstawiania) i robienie tego za pomocą obsługi wyjątków zapewnia prosty sposób obsługi całości za pomocą jednego wywołania sieciowego. Obecnie istnieje mnóstwo sposobów na wykonanie metody „sprawdź, a następnie wstaw”, jednocześnie unikając drugiego wywołania sieciowego, ale po prostu przechwycenie wyjątku prawdopodobnie będzie najprostszym sposobem na to.

Z drugiej strony obsługa wyjątków wymaga unikatowego ograniczenia (które jest w rzeczywistości unikalnym indeksem), co wiąże się z kompromisem wydajności:

  • Tworzenie unikatowego ograniczenia będzie powolne w przypadku bardzo dużych tabel i spowoduje spadek wydajności przy każdym wstawieniu do tej tabeli. W naprawdę dużych bazach danych musisz także zaplanować dodatkowe miejsce na dysku zużywane przez unikalny indeks używany do wymuszenia ograniczenia.
  • Z drugiej strony może to przyspieszyć wybieranie z tabeli, jeśli Twoje zapytania mogą skorzystać z tego indeksu.

Chciałbym również zauważyć, że jeśli jesteś w sytuacji, w której tak naprawdę chcesz „zaktualizować inne wstawienie” (tj. Jeśli rekord z unikalną wartością już istnieje, chcesz zaktualizować ten rekord, w przeciwnym razie wstawisz nowy rekord), to czego faktycznie chcesz użyć, to metoda UPSERT Twojej konkretnej bazy danych, jeśli taka istnieje. W przypadku SQL Server i Oracle będzie to instrukcja MERGE.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wymagania dotyczące odzyskiwania przed tworzeniem kopii zapasowych

  2. Mentor Oracle DBA

  3. Dobra praktyka otwierania/zamykania połączeń w aplikacji asp.net?

  4. Najszybszy sposób na sprawdzenie, czy jakieś rekordy w tabeli bazy danych?

  5. Czy w wyzwalaczu Oracle mogę przypisać nowe i stare do zmiennej rowtype?