In diesem Artikel geht es um Sequenzen, eine gute Alternative für den sonst üblichen Identity.
Was ist ein Sequenz?
Wer im Besitz eines SQL-Servers der Version 2012 oder höher ist, könnte sich mal überlegen ob in seiner Datenbank nicht Platz für die ein oder andere Sequenz ist. Man kann sich eine Sequenz wie die Identity-Eigenschaft vorstellen, jedoch kann man den inkrementellen Wert auf unzählig viele Tabellen anwenden, da die Sequenz keine Spalteneigenschaft ist sondern ein selbständiges Objekt das angesprochen werden kann. Zu vergleichen ist es mit einem “globalen” Counter. Alle Tabellen bei denen die Sequenz verwendet wird teilen sich die Wert. Das ist jedoch nicht alles, es besteht z.B. die Möglichkeit mit einer Sequenz einen zirkulierenden Wertebereich immer und immer wieder zu durchlaufen. Es gibt einen weiteren Unterschied zur Identity-Eigenschaft der ab und an sicherlich nützlich sein kann. Und zwar besteht die Möglichkeit die Sequenznummer ohne einen Einfüge Vorgang zu überspringen.
Definition einer Sequenz
Nun zum Syntax der so gut wie selbsterklärend.
Create Sequence TestSeq
Start with 0
Increment
by 5
Falls man es noch nicht selber herausgefunden hat in welchen Bereich sich die Sequenz bewegt hier die kurze Erklärung. Das “Create Sequence” wird mit dem Startwert “0” erstellt und erhöht sich immer um fünf. Bei dieser Definition kann der Wert bis auf den Maximum-Wert von Bigint gebracht werden. Nämlich 2^64 = 9223372036854775807.
Die Sequenz ist erstellt, aber wie verwende ich sie nun?
Select next value for TestSeq
Die Ausgabe zeigt nun das Ergebnis der Select-Anweisung drei mal hintereinander.
Bis jetzt haben wir den aktuellen Sequenzwert nur ausgegeben doch jetzt wollen wir ihn in einer Tabelle einfügen. Statement schaut wie folgt aus.
Insert
into TestTab
Select next value for TestSeq
Diese Insert-Statement habe ich auch drei mal ausgeführt. Das Ergebnis der Tabelle TestTab sieht so aus.
Und das war eigentlich schon der ganze Zauber, also fast.
Nun kommen noch ein paar Möglichkeiten wie man eine Sequenz erstellen kann.
1: Create Sequence CycSeq
2: as Decimal(10,0)
3: Start with 120
4: Increment by 30
5: Minvalue 90
6: Maxvalue 300
7: Cycle
8: Cache 5
Diesmal eine etwas ausgefallenere Sequenz-Definition. In der zweiten Zeile habe ich einen Datentyp angegeben, hier kann man alle Ganzzahl-Datentypen angeben und Numeric & Decimal nur mit einer Skala von 0. Je nachdem welchem Datentyp ich hier verwende, wird natürlich auch die Obergrenze des Bereiches festgelegt. In Zeile 5 habe ich einen Minimum-Wert gesetzt da es ein immer wiederholender Bereich ist. Logischerweise muss der Start-Wert im Bereich zwischen Min- und Maxvalue liegen (Sonst Fehler). Das Cycle in der vorletzten Zeile beschreibt nichts anderes als das die Sequenz sich immer wiederholt. Sobald der Maxwert erreicht wurde wird mit dem Minwert weitergemacht nicht mit dem Startwert!
Die letzte Zeile beschreibt die Cache-Größe der Sequenz. Was heißt das für uns? Ob der Cache nun gesetzt wird oder nicht kann einen großen Effekt auf die Performance haben. Die Cache-Option macht nichts anderes als kommende Sequenzwerte bereits in die Speicher zuladen und zwar genau so viele Werte wie der angegebene Cache groß ist, in unserem Fall fünf Werte. Nachteil des ganzen“gecaches” ist das Lücken in der Sequenz entstehen können, da die fünf kommenden Werte in den Arbeitsspeicher geladen werden und der nächste Wert der nach dem gecachten Werten kommen auf die Festplatte in eine Systemtabelle geschrieben werden. Kommt es nun zu einem Stromausfall sind alle gecachten Werte weg und der SQL-Server benutzt den Wert der in der Systemtabelle steht. Wer auf diese Risiko verzichten mag sollte anstelle von “Cache” einfach “no Cache” verwenden. Ein nichtangeben der Cache-Klausel bringt nichts da der SQL-Server einfach den Standardwert benutzt.
So viel zu Sequenzen…
P.S: Wer eine Sequenz neustarten will, sollte das so machen
Alter Sequence Testseq
Restart
with 0