Sequenz gegen Identität

87

SQL Server 2012 wurde Sequenceals neue Funktion eingeführt, genau wie in Oracle und Postgres. Wo werden Sequenzen gegenüber Identitäten bevorzugt? Und warum brauchen wir Sequenzen?

Sleiman Jneidi
quelle
Nachdem ich beide verwendet habe, bevorzuge ich Identität für die globale Verwendung in einer Datenbank. In diesem Fall benötigen Sie eine automatisch inkrementierende Nummer wie ObjectID und möchten sie in vielen Tabellen verwenden. Es wird kompliziert, eine Sequenz zu erstellen und dann eine Anwendung (Website oder App usw.) zu verwenden, um das Einfügen und Aktualisieren von Tabellen basierend auf einer Sequenznummer zu verwalten.
Band eins

Antworten:

81

Ich denke, Sie werden Ihre Antwort hier finden

Mit dem Identitätsattribut für eine Spalte können Sie auf einfache Weise automatisch inkrementierende Zahlen generieren (die so oft wie ein Primärschlüssel verwendet werden). Bei Sequence handelt es sich um ein anderes Objekt, das Sie beim Einfügen an eine Tabellenspalte anhängen können. Im Gegensatz zur Identität wird die nächste Nummer für den Spaltenwert eher aus dem Speicher als von der Festplatte abgerufen. Dadurch ist die Sequenz erheblich schneller als die Identität. Wir werden dies in den kommenden Beispielen sehen.

Und hier :

Sequenzen: Sequenzen werden seit Jahren von der SQL Server-Community angefordert und sind in dieser Version enthalten. Sequenz ist ein benutzerdefiniertes Objekt, das eine Sequenz einer Zahl generiert. Hier ist ein Beispiel mit Sequence.

und auch hier :

Ein SQL Server-Sequenzobjekt generiert eine Zahlenfolge wie eine Identitätsspalte in SQL-Tabellen. Der Vorteil von Sequenznummern ist jedoch, dass das Sequenznummernobjekt nicht auf eine einzelne SQL-Tabelle beschränkt ist.

und auf msdn können Sie auch mehr über die Nutzung lesen und warum wir sie brauchen ( hier ):

Eine Sequenz ist ein benutzerdefiniertes schemagebundenes Objekt, das eine Sequenz numerischer Werte gemäß der Spezifikation generiert, mit der die Sequenz erstellt wurde. Die Folge von numerischen Werten wird in aufsteigender oder absteigender Reihenfolge in einem definierten Intervall erzeugt und kann nach Bedarf zyklisch (wiederholt) werden. Sequenzen sind im Gegensatz zu Identitätsspalten keinen Tabellen zugeordnet. Eine Anwendung bezieht sich auf ein Sequenzobjekt, um seinen nächsten Wert zu erhalten. Die Beziehung zwischen Sequenzen und Tabellen wird von der Anwendung gesteuert. Benutzeranwendungen können auf ein Sequenzobjekt verweisen und die Werteschlüssel über mehrere Zeilen und Tabellen hinweg koordinieren.

Mit der Anweisung CREATE SEQUENCE wird unabhängig von den Tabellen eine Sequenz erstellt. Mit den Optionen können Sie das Inkrement, die Maximal- und Minimalwerte, den Startpunkt, die automatische Neustartfunktion und das Caching steuern, um die Leistung zu verbessern. Informationen zu den Optionen finden Sie unter CREATE SEQUENCE.

Im Gegensatz zu Identitätsspaltenwerten, die beim Einfügen von Zeilen generiert werden, kann eine Anwendung die nächste Sequenznummer vor dem Einfügen der Zeile durch Aufrufen der Funktion NEXT VALUE FOR abrufen. Die Sequenznummer wird zugewiesen, wenn NEXT VALUE FOR aufgerufen wird, auch wenn die Nummer niemals in eine Tabelle eingefügt wird. Die Funktion NEXT VALUE FOR kann als Standardwert für eine Spalte in einer Tabellendefinition verwendet werden. Verwenden Sie sp_sequence_get_range, um einen Bereich mit mehreren Sequenznummern gleichzeitig abzurufen.

Eine Sequenz kann als ein beliebiger ganzzahliger Datentyp definiert werden. Wenn der Datentyp nicht angegeben wird, ist eine Sequenz standardmäßig bigint.

Arion
quelle
21

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.

user1059637
quelle
14

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:

  • 14 Sekunden für die Identität
  • 45 Sekunden für die Sequenz

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:

SELECT NEXT VALUE for <seq>, <other columns> from <table>

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.

Stagg
quelle
Was war die Cache-Größe der Sequenz.
Shannon Severance
50, es zu erhöhen macht einen Unterschied, aber ich erinnere mich, dass die Identität immer noch schneller war.
Stagg
2
byobi.com/blog/2012/09/… Bietet einen guten detaillierten Vergleich verschiedener Konfigurationen. Zeigt, dass eine Erhöhung der Cache-Größe von 50 auf 500 ungefähr einen zweifachen Geschwindigkeitsunterschied ergab.
ulty4life
Schlagen Sie vor, dass Sequenzen langsamer als die Identitätsspalte sind? Ich hatte den gegenteiligen Eindruck, da Sequenzen im Gegensatz zur Identität, die von der Festplatte abgerufen wird, im Speicher gespeichert sind. Ihre Ergebnisse sind ziemlich überraschend. Schön, dass du geteilt hast.
RBT
1
Mit sequence können Sie die Leistung beim Batch-Einfügen optimieren, indem Sie 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.
Gordon
5

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.

Ken
quelle
2

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.

Greg Gum
quelle
1

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.

awilbourn
quelle
1
Es ist eine ziemlich gute Antwort, warum Sie das Überspringen IDENTITYZahl verknüpfen und SEQUENCEhat 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.
Mrphin