it-swarm.com.de

Sequenz gegen Identität

In SQL Server 2012 wurde Sequence als neues Feature eingeführt, genau wie in Oracle und Postgres. Wo werden Sequenzen Identitäten vorgezogen? Und warum brauchen wir Sequenzen?

76
Sleiman Jneidi

Ich denke, Sie werden Ihre Antwort finden hier

Mit dem Identitätsattribut für eine Spalte können Sie einfach 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 Zahl für den Spaltenwert aus dem Speicher und nicht von der Festplatte abgerufen. Dadurch ist Sequence erheblich schneller als Identity. Wir werden dies in 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 hier auch:

Ein SQL Server-Sequenzobjekt generiert eine Folge von Zahlen 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 Verwendung und warum wir es brauchen lesen ( hier ):

Eine Sequenz ist ein benutzerdefiniertes schemagebundenes Objekt, das eine Folge von numerischen Werten gemäß der Spezifikation generiert, mit der die Sequenz erstellt wurde. Die Folge numerischer Werte wird in einem definierten Intervall in aufsteigender oder absteigender Reihenfolge generiert und kann nach Bedarf wiederholt werden. Sequenzen sind im Gegensatz zu Identitätsspalten keinen Tabellen zugeordnet. Eine Anwendung verweist 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.

Eine Sequenz wird unabhängig von den Tabellen mit der Anweisung CREATE SEQUENCE erstellt. Mit den Optionen können Sie das Inkrement, die Maximal- und Minimalwerte, den Startpunkt, die Fähigkeit zum automatischen Neustart und das Zwischenspeichern 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 Folgenummer vor dem Einfügen der Zeile durch Aufrufen der Funktion NEXT VALUE FOR ermitteln. Die Folgenummer wird beim Aufruf von NEXT VALUE FOR vergeben, auch wenn die Nummer nie 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 mehrere Folgenummern gleichzeitig abzurufen.

Eine Sequenz kann als ein beliebiger ganzzahliger Datentyp definiert werden. Wenn der Datentyp nicht angegeben ist, ist die Standardeinstellung für eine Sequenz bigint.

70
Arion

Sequenz und Identität werden beide zur Generierung der automatischen Nummer verwendet, der Hauptunterschied ist jedoch, dass Identität tabellenabhängig und Sequenz tabellenunabhängig ist.

Wenn Sie ein Szenario haben, in dem Sie eine automatische Nummer global (in mehreren Tabellen) verwalten müssen, müssen Sie auch das Intervall nach einer bestimmten Nummer neu starten und es auch für die Leistung zwischenspeichern Identität.

Nachstehend sind die Artikel aufgeführt, die das reale Beispiel der Sequenz, ihre Implementierung und auch den Unterschied zwischen Sequenz und Identität definieren.

http://raresql.com/2012/04/29/how-sequence-works-in-sql-server-2012/http://raresql.com/2012/05/01/unterschied-zwischen-identität-und-sequenz /

19
user1059637

Sequenzen bieten zwar mehr Flexibilität als Identitätsspalten, ich habe jedoch keine Leistungsvorteile festgestellt.

Ich fand heraus, dass die Leistung bei der Verwendung von Identität durchweg dreimal schneller war als bei der Verwendung von Sequenzen für Batch-Einfü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, die das Sequenzobjekt über einen Tabellenstandard verwendet:

NEXT VALUE for <seq> for <col_name>

und auch versucht, Sequenzwert in Select-Anweisung anzugeben:

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

Beide waren derselbe 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 für zeilenweise Einfügungen, 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, die Identität ist jedoch schneller für höhere Volumes (+ 1 Million Zeilen).

Siehe hierzu link für eine eingehende Analyse gemäß utly4life's Kommentar.

12
Stagg

Ich weiß, dass dies ein bisschen alt ist, wollte aber eine Bemerkung hinzufügen, die mich biss.

Ich wechselte von Identität zu Sequenz, um meine Indizes in Ordnung zu bringen. Ich habe später herausgefunden, 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, worauf Sie achten müssen, bevor Sie eine Entscheidung treffen.

3
Ken

In letzter Zeit gab es einiges zu beachten für Identität vs. Sequenz. Offenbar schlägt MSFT jetzt eine Reihenfolge vor, wenn Sie die Identität lückenlos beibehalten 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 dies unser Problem erklären, dass SQL die Identität zwischengespeichert hat und wir diese Zahlen nach dem Neustart 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 Serverneustart oder anderen Fehlern - SQL Server speichert möglicherweise Identitätswerte aus Leistungsgründen im Cache, und einige der zugewiesenen Werte können während eines Datenbankfehlers oder eines Serverneustarts verloren gehen. Dies kann zu Lücken im Identitätswert beim Einfügen 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.

1
awilbourn

Ich finde, die beste Verwendung von Sequenzen besteht darin, keine Identitätsspalte zu ersetzen, sondern einen Feldtyp "Bestellnummer" zu erstellen.

Mit anderen Worten, eine Bestellnummer wird dem Endbenutzer angezeigt und kann Geschäftsregeln enthalten. Sie möchten, dass es eindeutig ist, aber es ist auch nicht richtig, nur eine Identitätsspalte zu verwenden.

Beispielsweise erfordern verschiedene Auftragstypen möglicherweise eine andere Reihenfolge, sodass Sie im Gegensatz zu Inhouse-Aufträgen möglicherweise eine Reihenfolge für Internet-Aufträge festlegen.

Mit anderen Worten, stellen Sie sich eine Sequenz nicht als einfachen Ersatz für Identität vor, sondern als nützlich, wenn eine Identität nicht den Geschäftsanforderungen entspricht.

0
Greg Gum