Oracle
 sql >> Datenbank >  >> RDS >> Oracle

UNIQUE-Einschränkung vs. Überprüfung vor INSERT

Ich denke, in den meisten Fällen werden die Unterschiede zwischen diesen beiden klein genug sein, dass die Wahl hauptsächlich von der Auswahl der Implementierung bestimmt werden sollte, die für jemanden, der sich den Code zum ersten Mal ansieht, am verständlichsten ist.

Ich denke jedoch, dass die Ausnahmebehandlung ein paar kleine hat Vorteile:

  • Die Ausnahmebehandlung vermeidet eine potenzielle Racebedingung. Die Methode „Prüfen, dann einfügen“ schlägt möglicherweise fehl, wenn ein anderer Prozess einen Datensatz zwischen Ihrer Prüfung und Ihrer Einfügung einfügt. Also, selbst wenn Sie 'Prüfen, dann Einfügen' machen, wollen Sie immer noch Ausnahmebehandlung beim Einfügen, und wenn Sie sowieso schon Ausnahmebehandlung machen, dann können Sie genauso gut auf die anfängliche Prüfung verzichten.

  • Wenn Ihr Code keine gespeicherte Prozedur ist und über das Netzwerk mit der Datenbank interagieren muss (d. H. Die Anwendung und die Datenbank befinden sich nicht auf derselben Box), möchten Sie vermeiden, dass zwei separate Netzwerkaufrufe (einer für die Überprüfung und der andere für die Einfügung) und dies über die Ausnahmebehandlung zu tun, bietet eine einfache Möglichkeit, das Ganze mit einem einzigen Netzwerkaufruf zu handhaben. Nun, es gibt Unmengen von Möglichkeiten, die 'Überprüfen, dann einfügen'-Methode auszuführen, während der zweite Netzwerkaufruf immer noch vermieden wird, aber das einfache Abfangen der Ausnahme ist wahrscheinlich der einfachste Weg, dies zu tun.

Auf der anderen Seite erfordert die Ausnahmebehandlung eine eindeutige Einschränkung (die eigentlich ein eindeutiger Index ist), die mit Leistungseinbußen einhergeht:

  • Das Erstellen einer Unique-Einschränkung ist bei sehr großen Tabellen langsam und führt zu Leistungseinbußen bei jeder einzelnen Einfügung in diese Tabelle. Bei wirklich großen Datenbanken müssen Sie auch den zusätzlichen Speicherplatz einplanen, der durch den eindeutigen Index verbraucht wird, der zur Durchsetzung der Einschränkung verwendet wird.
  • Andererseits kann es die Auswahl aus der Tabelle beschleunigen, wenn Ihre Abfragen diesen Index nutzen können.

Ich möchte auch darauf hinweisen, dass Sie, wenn Sie sich in einer Situation befinden, in der Sie eigentlich "aktualisieren, sonst einfügen" möchten (d. H. Wenn ein Datensatz mit dem eindeutigen Wert bereits vorhanden ist, diesen Datensatz aktualisieren möchten, andernfalls fügen Sie einen neuen ein record) verwenden möchten, dann ist das, was Sie tatsächlich verwenden möchten, die UPSERT-Methode Ihrer speziellen Datenbank, falls vorhanden. Für SQL Server und Oracle wäre dies eine MERGE-Anweisung.