In seiner Antwort auf Welche ist besser: Identitätsspalten oder generierte eindeutige ID-Werte? Mrdenny sagt:
Wenn SQL Denali herauskommt, werden Sequenzen unterstützt, die effizienter sind als Identität, aber Sie können selbst nichts effizienteres erstellen.
Ich bin mir nicht sicher. Wenn ich die Sequenzen von Oracle kenne , muss ich entweder einen Auslöser für die Einfügung erstellen, jede Einfügung in einen Aufruf einer gespeicherten Prozedur einkapseln oder beten, dass ich nicht vergesse, die Sequenz richtig zu verwenden, wenn ich eine Ad-hoc-Einfügung vornehme.
Ich bezweifle, dass die Vorteile von Sequenzen so offensichtlich sind.
sql-server
sql-server-2012
sequence
bernd_k
quelle
quelle
Antworten:
Ich werde auch hier antworten. Es hat mit den Interna von wie
IDENTITY
undSEQUENCE
Arbeit zu tun .Mit
IDENTITY
SQL Server werden Werte vorab im Arbeitsspeicher zwischengespeichert, damit sie sofort verfügbar sind. Siehe Martin Smith Antwort für die Details. Wenn Werte verwendet werden, generiert ein Hintergrundprozess mehr Werte. Wie Sie sich vorstellen können, kann dieser Pool ziemlich schnell ausgehen und die Anwendung dem Hintergrundprozess aussetzen, der die Werte generiert.Mit
SEQUENCE
SQL Server können Sie festlegen, wie groß der Cache sein soll. SQL Server behält zwar nicht die Werte im Cache bei, behält jedoch nur den aktuellen Wert und den oberen Endwert bei. Dadurch wird die zum Erstellen von Werten erforderliche Anzahl von E / A-Vorgängen erheblich reduziert.Stellen Sie den Cache nicht zu hoch ein, da dies die Anzahl der verwendbaren Zahlen verringert: Wenn SQL Server abstürzt, gehen alle im aktuellen Cache-Bereich angegebenen Werte verloren, die nicht verwendet wurden.
Geben Sie für das Einfügen von Zeilen einfach einen Standardwert für die Spalte an, wie folgt:
quelle
Seit der Veröffentlichung des Artikels von Itzik Ben Gan
IDENTITY
scheint sich die fest codierte Cachegröße von 10 für geändert zu haben. Aus den Kommentaren zu diesem VerbindungselementDas T-SQL-Abfragebuch enthält die folgende Tabelle, weist jedoch darauf hin, dass diese Werte nicht dokumentiert sind oder garantiert nicht geändert werden.
In diesem Artikel werden verschiedene Sequence-Cache-Größen und Insert-Batch-Größen getestet und die folgenden Ergebnisse erzielt.
Was zu zeigen scheint, dass bei großen Inserts
IDENTITY
Out funktioniertSEQUENCE
. Die Cache-Größe 1.000 wird jedoch nicht getestet, und auch diese Ergebnisse sind nur ein Test. Bei genauerer Betrachtung der Cache-Größe 1.000 mit verschiedenen Stapelgrößen von Inserts ergaben sich die folgenden Ergebnisse (50-maliger Versuch jeder Stapelgröße und Aggregation der Ergebnisse wie folgt - alle Male in μs).Bei größeren Losgrößen erscheint die
IDENTITY
Version in der Regel schneller .Das Buch TSQL-Abfragen erläutert auch, warum
IDENTITY
die Leistung gegenüber der Sequenz von Vorteil sein kann.Das
IDENTITY
ist tabellenspezifisch undSEQUENCE
nicht. Wenn die Katastrophe eine mittlere Einfügemarke war, bevor der Protokollpuffer geleert wurde, spielt es keine Rolle, ob die wiederhergestellte Identität eine frühere ist, da der Wiederherstellungsprozess auch die Einfügung rückgängig macht, sodass SQL Server das Leeren des Protokollpuffers nicht für jede Identität erzwingt Cache-bezogene Disc schreiben. Für Sequence wird dies jedoch erzwungen, da der Wert für jeden Zweck verwendet werden kann - auch außerhalb der Datenbank. Im obigen Beispiel mit einer Million Einfügungen und einer Cache-Größe von 1.000 sind dies zusätzliche tausend Protokolllöschungen.Zu reproduzierendes Skript
quelle