Es ist der Fall, dass IDENTITY_INSERT immer nur in einer Datenbanktabelle auf ON gesetzt werden kann, aber warum? Da IDENTITY
Spalten nicht global eindeutig sind, kann ich mir keine gefährliche Situation vorstellen, die durch das gleichzeitige Einfügen von Identitäten in mehr als eine Tabelle verursacht werden könnte (zumindest nicht gefährlicher als das generelle Verwechseln mit IDENTITY INSERT).
IDENTITY INSERT sollte selten verwendet werden, aber was ist der Grund für das harte Limit?
sql-server
Ben Brocka
quelle
quelle
Antworten:
Ich denke, es soll es schwierig machen. Wenn Sie es einfach die ganze Zeit eingeschaltet lassen könnten, warum dann überhaupt ein Identitätsfeld?
Tatsächlich gibt es jedoch einige Einschränkungen:
Aufgrund der Verbindungseinschränkungen denke ich, dass es hauptsächlich so ist, dass es niemals versehentlich eingeschaltet bleibt.
Stellen Sie sich vor, wenn jemand die ID-Einfügung für eine Ihrer Tabellen aktiviert hat, haben Sie nicht bemerkt, dass eine (normalerweise) ungültige Einfügung durchgeführt wurde, die die Integrität Ihres ID-Felds verletzt hat?
Beachten Sie, dass ID-Felder doppelte Werte haben können, wenn keine Einschränkung oder eindeutiger Index vorhanden ist ...
quelle
IDENTITY
es auch eine einzigartige Einschränkung. Sehr leicht zu widerlegen, natürlich, wenn sie es trotzdem versuchen.Ich vermute, dass dies eine Einschränkung aufgrund der Implementierung war. Das Zulassen dieser Einstellung für mehrere Tische war ein potenzieller Leistungstreffer:
Da dies ein Sitzungsparameter ist, bedeutet das Aktivieren der Einstellung für eine einzelne Tabelle, dass es sich um ein einfaches Flag handelt und die Objekt-ID der Tabelle in der Sitzung serverseitig gespeichert werden soll. Möglicherweise ist dies nur eine einzelne Ganzzahl: 0, wenn kein IDENTITY_INSERT aktiv ist, und eine Codierung von databaseid + objectid für die Tabelle.
Das Zulassen des Parameters für mehrere Tabellen in einer Sitzung würde bedeuten, dass der Server eine dynamische Liste solcher Objekte speichert und diese für jede Einfügeanweisung überprüft. Stellen Sie sich vor, eine Sitzung aktiviert den Parameter für tausend Tabellen:
Ich vermute auch, dass set identity_insert on einen performanceübergreifenden Performance-Hit auf dem Server hat. In sybase gab es einen " Identity Burning Set Factor ", der es erlaubte, den Wert des Identitätszählers einer Tabelle nur einmal zu speichern (der Wert wird im Speicher gehalten und von Zeit zu Zeit und auf dem Server auf die Festplatte geschrieben) ausschalten ). SQL Server basiert auf demselben Code und weist daher wahrscheinlich eine vergleichbare Optimierung auf. Wenn Sie jedoch identity_insert für eine Tabelle aktivieren, muss der Server möglicherweise den Identitätswert für jede Einfügung speichern, da sonst keine maximale Lückengröße garantiert werden kann. Wenn also eine Sitzung einen Leistungstreffer für die Einfügungen in einer Tabelle erzielt, ist dies wahrscheinlich akzeptabel, aber nicht, wenn der Leistungstreffer für alle auto_increment-Tabellen auf dem Server erzielt werden kann.
quelle
INSERT
eine Sitzung durchgeführt werden kann und ich problemlos 10 Millionen hartcodierteIDENTITY
Werte einfügen könnte .SET IDENTITY_INSERT
aktiviert ist? Ich schlage nur vor, dass die Lückengröße mehrere Tabellen nicht anders beeinflusst als eine einzelne Tabelle.