sql >> Database >  >> RDS >> Oracle

UNIEKE beperking versus controleren vóór INSERT

Ik denk dat de verschillen tussen die twee in de meeste gevallen zo klein zullen zijn dat de keuze voornamelijk moet worden bepaald door de implementatie te kiezen die het meest begrijpelijk is voor iemand die voor het eerst naar de code kijkt.

Ik denk echter dat het afhandelen van uitzonderingen een paar kleine . heeft voordelen:

  • Exception handling vermijdt een mogelijke raceconditie. De 'check, then insert'-methode kan mislukken als een ander proces een record invoegt tussen uw cheque en uw insert. Dus zelfs als je 'controleren en dan invoegen' doet, wil je nog steeds de afhandeling van uitzonderingen op de invoeging en als je toch al uitzonderingen afhandelt, kun je net zo goed de eerste controle afschaffen.

  • Als uw code geen opgeslagen procedure is en via het netwerk met de database moet communiceren (d.w.z. de applicatie en de db bevinden zich niet op dezelfde box), dan wilt u voorkomen dat u twee afzonderlijke netwerkaanroepen hebt (een voor de controle en de andere voor de insert) en dit te doen via exception handling biedt een eenvoudige manier om de hele zaak af te handelen met een enkele netwerkoproep. Nu zijn er talloze manieren om de 'controleer en dan invoegen'-methode uit te voeren en toch de tweede netwerkaanroep te vermijden, maar het simpelweg opvangen van de uitzondering is waarschijnlijk de eenvoudigste manier om dit aan te pakken.

Aan de andere kant vereist het afhandelen van uitzonderingen een unieke beperking (wat in feite een unieke index is), die gepaard gaat met een prestatieafweging:

  • Het creëren van een unieke beperking zal traag zijn op zeer grote tafels en het zal een prestatiehit veroorzaken bij elke afzonderlijke invoeging van die tafel. Op echt grote databases moet u ook budgetteren voor de extra schijfruimte die wordt verbruikt door de unieke index die wordt gebruikt om de beperking af te dwingen.
  • Aan de andere kant kan het ervoor zorgen dat u sneller uit de tabel kunt selecteren als uw zoekopdrachten kunnen profiteren van die index.

Ik zou ook opmerken dat als u zich in een situatie bevindt waarin u eigenlijk 'update else insert' wilt doen (d.w.z. als een record met de unieke waarde al bestaat, u die record wilt bijwerken, anders voegt u een nieuwe in record) dan is wat u eigenlijk wilt gebruiken de UPSERT-methode van uw specifieke database, als deze er een heeft. Voor SQL Server en Oracle zou dit een MERGE-instructie zijn.



  1. Master High Availability Manager (MHA) is gecrasht! Wat moet ik nu doen?

  2. Hoe u uw ProxySQL-loadbalancers kunt clusteren

  3. Een beperking van een externe sleutel in SQL Server uitschakelen (T-SQL-voorbeelden)

  4. Wat zijn databanken?