sql >> Databáze >  >> RDS >> Oracle

UNIKÁTNÍ omezení vs kontrola před INSERT

Myslím, že ve většině případů budou rozdíly mezi těmito dvěma dostatečně malé, že výběr by měl být většinou řízen výběrem implementace, která je nakonec nejsrozumitelnější pro někoho, kdo se na kód dívá poprvé.

Myslím si však, že zpracování výjimek má několik malých výhody:

  • Zpracování výjimek zabrání potenciálnímu sporu. Metoda 'check, then insert' může selhat, pokud jiný proces vloží záznam mezi vaši kontrolu a vaši přílohu. Takže i když děláte 'zkontrolovat a potom vložit', stále chcete zpracování výjimek na insertu, a pokud již provádíte zpracování výjimek, můžete také skoncovat s počáteční kontrolou.

  • Pokud váš kód není uložená procedura a musí interagovat s databází přes síť (tj. aplikace a db nejsou ve stejném boxu), pak se chcete vyhnout dvěma samostatným síťovým voláním (jedno pro kontrolu a jiné pro vložku) a dělat to prostřednictvím zpracování výjimek poskytuje přímý způsob zpracování celé věci pomocí jediného síťového volání. Nyní existuje spousta způsobů, jak provést metodu 'zkontrolovat a potom vložit' a přitom se vyhnout druhému síťovému volání, ale jednoduché zachycení výjimky bude pravděpodobně nejjednodušší způsob, jak toho dosáhnout.

Na druhou stranu zpracování výjimek vyžaduje jedinečné omezení (což je ve skutečnosti jedinečný index), které přichází s kompromisem výkonu:

  • Vytvoření jedinečného omezení bude u velmi velkých tabulek pomalé a způsobí snížení výkonu u každého jednotlivého vložení do této tabulky. U skutečně velkých databází musíte také počítat s extra prostorem na disku spotřebovaným jedinečným indexem používaným k vynucení omezení.
  • Na druhou stranu to může urychlit výběr z tabulky, pokud vaše dotazy mohou využít tento index.

Chtěl bych také poznamenat, že pokud jste v situaci, kdy to, co ve skutečnosti chcete udělat, je „aktualizovat jinak vložit“ (tj. pokud záznam s jedinečnou hodnotou již existuje, chcete tento záznam aktualizovat, jinak vložíte nový záznam), pak to, co skutečně chcete použít, je metoda UPSERT vaší konkrétní databáze, pokud ji má. Pro SQL Server a Oracle by to byl příkaz MERGE.



  1. Nejrychlejší způsob aktualizace 120 milionů záznamů

  2. Existuje nějaký způsob, jak vložit nebo aktualizovat SQLBulkCopy?

  3. Chyba SQL:ORA-02000:chybí klíčové slovo ALWAYS při vytváření tabulky založené na sloupcích identity

  4. Jak zobrazit aktuální nastavení pro nulový výstup v PostgreSQL (psql)