PDA

View Full Version : SQL Insert



Joe
20-02-04, 16:48
Hallo Forum.

Schon wieder ich...

Wie prüfe ich sinnvoll das Vorhandensein von Sätzen beim
Insert?

1. Tabelle mit Unique Key definieren , Insert absetzen und
SQLCODE prüfen

oder

2. Select Count(*) und bei > 0 kein Insert.

oder

3. ???

Ich verwende Pkt. 1

Den "Select Count(*)" habe ich jetzt in verschiedenen Programmen oder Beispielen gesehen. Wie sieht es denn da
mit der Performance aus wenn eine Tabelle mehrere Mio. Sätze
enthält. Oder wie "zählt" der Count?

Gruss
Joe

Fuerchau
20-02-04, 16:54
Den Insert auf einen Fehler laufen zu lassen ist (meistens) besser, da zwischen dem "select count(*)" und dem Insert ein anderer Job den Insert durchführen kann.
Der Select gibt zwar den momentanen Stand, der kann sich aber Millisekunden später schon ändern.

Der Select ist schnell, wenn es über die Felder der where-Bedingung eine LF (Index) gibt.

BenderD
20-02-04, 16:59
Hallo Joe,

direkter INSERT ist das Beste

SELECT COUNT(*) ist Murks, weil das nur heisst das jetzt noch keiner da war, beim tatsächlichen INSERT könnte sich das geändert haben.

Wenn bei vorhandenem Satz ein Update erfolgt, könnte man auch diesen zuerst probieren und wenn der schief geht den INSERT machen. Das ist dann minimal billiger, wenn der Satz eher vorhanden ist, aber komplizierter zu programmieren, wenn der Satz dann doch da ist, weil einer schneller war.

Wieder mal: mit der Peorformance, das ist meist viel zu kurz gedacht; Datenbankperformance ist dominiert von zwei Dingen:
1. Zugriffspfade (hat mit den Statements nix zu tun)
2. Sperrkonflikte (dauert bei Deadlock 60 sec.)
Zweiteres wird zu 99,9 % übersehen!!! Statt dessen wird gerne über Kleinigkeiten spekuliert und schwadroniert. Das einzige was hier zählt ist messen!!!

mfg

Dieter Bender

Joe
21-02-04, 13:42
Danke für die, wie immer, prompten und qualifizierten Anworten.

Gruss Joe