SQL Server 2012 wurde Sequence
als neue Funktion eingeführt, genau wie in Oracle und Postgres. Wo werden Sequenzen gegenüber Identitäten bevorzugt? Und warum brauchen wir Sequenzen?
sql
sql-server
tsql
sql-server-2012
Sleiman Jneidi
quelle
quelle
Antworten:
Ich denke, Sie werden Ihre Antwort hier finden
Und hier :
und auch hier :
und auf msdn können Sie auch mehr über die Nutzung lesen und warum wir sie brauchen ( hier ):
quelle
Sequenz und Identität werden beide zum Generieren der automatischen Nummer verwendet. Der Hauptunterschied besteht jedoch darin, dass Identität tabellenabhängig und Sequenz unabhängig von der Tabelle ist.
Wenn Sie ein Szenario haben, in dem Sie eine automatische Nummer global (in mehreren Tabellen) verwalten müssen, müssen Sie auch Ihr Intervall nach einer bestimmten Nummer neu starten und es auch für die Leistung zwischenspeichern. Hier ist die Stelle, an der wir eine Sequenz benötigen und nicht Identität.
quelle
Obwohl Sequenzen flexibler sind als Identitätsspalten, habe ich keine Leistungsvorteile festgestellt.
Ich fand, dass die Leistung bei Verwendung der Identität durchweg dreimal schneller war als bei Verwendung der Sequenz für Stapeleinfügungen.
Ich habe ca. 1,5 Millionen Zeilen eingefügt und die Leistung war:
Ich habe die Zeilen in eine Tabelle eingefügt, in der das Sequenzobjekt über eine Tabellenvorgabe verwendet wurde:
NEXT VALUE for <seq> for <col_name>
und versuchte auch, den Sequenzwert in der select-Anweisung anzugeben:
Beide waren der gleiche Faktor langsamer als die Identitätsmethode. Ich habe die Standard-Cache-Option für die Sequenz verwendet.
Der Artikel, auf den in Arions erstem Link verwiesen wird, zeigt die Leistung beim zeilenweisen Einfügen, und der Unterschied zwischen Identität und Sequenz betrug 16,6 Sekunden bis 14,3 Sekunden für 10.000 Einfügungen.
Die Caching-Option hat einen großen Einfluss auf die Leistung, aber die Identität ist bei höheren Volumes (+ 1 Million Zeilen) schneller.
Unter diesem Link finden Sie eine eingehende Analyse gemäß dem Kommentar von utly4life.
quelle
alter sequence increment by ...
einfach Platz für Ihre neuen Zeilen schaffen und dann base + row_number () oder was auch immer für die tatsächlichen Werte verwenden.Ich weiß, dass dies ein bisschen alt ist, wollte aber eine Beobachtung hinzufügen, die mich biss.
Ich habe von Identität zu Sequenz gewechselt, um meine Indizes in Ordnung zu bringen. Ich fand später heraus, dass die Sequenz nicht mit der Replikation übertragen wird. Nachdem ich die Replikation zwischen zwei Datenbanken eingerichtet hatte, kam es zu Schlüsselverletzungen, da die Sequenzen nicht synchron waren. Nur etwas, auf das Sie achten müssen, bevor Sie eine Entscheidung treffen.
quelle
Ich finde, die beste Verwendung von Sequenzen besteht nicht darin, eine Identitätsspalte zu ersetzen, sondern ein Feld vom Typ "Bestellnummer" zu erstellen.
Mit anderen Worten, eine Bestellnummer ist dem Endbenutzer zugänglich und kann Geschäftsregeln enthalten. Sie möchten, dass es eindeutig ist, aber die Verwendung einer Identitätsspalte ist auch nicht wirklich korrekt.
Beispielsweise erfordern unterschiedliche Auftragstypen möglicherweise eine unterschiedliche Reihenfolge, sodass Sie möglicherweise eine Reihenfolge für Internetbestellungen haben, im Gegensatz zu internen Bestellungen.
Mit anderen Worten, stellen Sie sich eine Sequenz nicht als einfachen Ersatz für Identität vor, sondern als nützlich in Fällen, in denen eine Identität nicht den Geschäftsanforderungen entspricht.
quelle
Vor kurzem wurde etwas für Identität gegen Sequenz zu berücksichtigen. Scheint, als würde MSFT jetzt eine Sequenz vorschlagen, wenn Sie die Identität ohne Lücken behalten möchten. Wir hatten ein Problem, bei dem es große Lücken in der Identität gab, aber basierend auf dieser hervorgehobenen Aussage würde unser Problem erklären, dass SQL die Identität zwischengespeichert hat und nach dem Neustart diese Nummern verloren haben.
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017
Aufeinanderfolgende Werte nach einem Neustart des Servers oder anderen Fehlern - SQL Server kann aus Leistungsgründen Identitätswerte zwischenspeichern, und einige der zugewiesenen Werte können während eines Datenbankfehlers oder eines Neustarts des Servers verloren gehen. Dies kann beim Einfügen zu Lücken im Identitätswert führen. Wenn Lücken nicht akzeptabel sind, sollte die Anwendung einen eigenen Mechanismus verwenden, um Schlüsselwerte zu generieren. Die Verwendung eines Sequenzgenerators mit der Option NOCACHE kann die Lücken auf Transaktionen beschränken, die niemals festgeschrieben werden.
quelle
IDENTITY
Zahl verknüpfen undSEQUENCE
hat das gleiche Problem wie hier beschrieben verknüpfen , aber Sie können es begrenzen , indem eine kleinere Cachegröße einstellen , aber es dann gibt es einen Kompromiss mit der Geschwindigkeit.