SQL Was ist schneller

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.110
Ich habe ganz allgemeine Frage.

Wenn man eine insert query absetzt und die ID des neuen Datensatzes herausfinden will, womit würde man schnellere Ergebnisse erzielen? Mit SCOPE_IDENTITY oder OUTPUT INSERTED.id

Mit Output ist man auf der sicherer Seite. Was für Vor- und Nachteile gibt es?
 
Von welchem Datenbanksystem sprichst du überhaupt? ;)
Ich kann mit beidem gerade nichts anfangen, denn das scheint kein Teil des SQL-Standards zu sein.
 
Innerhalb einer Prozedur oder eines Batches?

Und ich würde auch mal auf MS SqlServer tippen, da mir beide nur bei dem bekannt sind.
Aber insgesamt klingts für mich nach Microtuning, falls es überhaupt einen Geschwindigkeitunterschied gibt. Wobei mir die Output Variante nur in Zusammenhang mit einer temporären Tabelle bekannt ist, d.h. die (und zwar alle) ID Werte eines INSERTS werden in eine zusätzliche Tabelle, bei den Beispielen wird oft eine temporäre Tabelle verwendet, eingetragen und dann separat mittels SELECT ausgelesen. Also wäre es für mich wichtig zu wissen ob du das ganze in T-SQL oder in einer externen App als Batch ausführen willst. Und wie sind die INSERTS? Mit Werteliste oder als SELECT definiert?
 
Schneller ist glaube ich jetzt ungünstig gefragt, da beide unterschiedliche Dinge tun.

scope_identity() gibt dir die letze ID an, die aus dem Gültigkeitsbereich eingefügt wurde, was immer nur ein Wert ist und nur bei Identitätsspalten Sinn macht.
Über die output-Funktion bekommst du nicht nur den letzten Wert, sondern alle Werte und funktioniert mit allen Spalten.
In beiden Fällen aber darf man von der letzen ID nicht auf die maximal ID der Zieltabelle schließen!

Von der Laufzeit her kann ich es nicht bewerten.
Wenn das aber genau dein Problem ist (Glaskugel mit Schamanen putz) und du einzel-inserts absetzt, dann versuch mal, wenn möglich, mehrere inserts in eine Transaktion zusammen zu fassen.
 
ja sorry es ist MS SQL.

Es handelt sich um die einzelnen Batches und keine Prozedure. Es geht um event LOG (nicht meine Entscheidung, aber es soll über PHP laufen und nicht direkt auf der DB).

Bin jetzt kein kenner, aber verursacht output keinen select? An sich ist scope_identity eine skalare statische variable, was an sich ja schnelleren zugriff fördern sollte. Transaktionen sollte es nicht geben, da an einigen stellen von den tabellen so schnell wie möglich gelesen werden soll und nicht gelockt werden. Aber es läuft alles über eine und die selbe connection, was zumindest schnell genug sein soll.

Mir geht es eigentlich nicht darum, dass ich die ID hochzähle (dafür ist ja auch identity da).
 
roker002 schrieb:
Bin jetzt kein kenner, aber verursacht output keinen select?
Wenn du einen table scan meinst - nein. So weit ich weiß greift es direkt auf die interne Struktur zu, die für das Insert sowieso erstellt werden muss. Aber ein Kenner bin ich auch nicht. ;)
roker002 schrieb:
da an einigen stellen von den tabellen so schnell wie möglich gelesen werden soll und nicht gelockt werden.
Wenn es im Kontext der Applikation zulässig ist könnt ihr dort auch das Selekt mit einem uncommitted read absetzen.
 
Also ist es eigentlich egal, was schneller ist, da es soweit ich verstanden habe, beides ungefähr gleich schnell ist. Gut zu wissen.

Ja in den meisten fällen wird Read Uncommited gemacht. Bei Prozeduren auch immer ohne Ausnahme.

Danke
 
Zurück
Oben