Dans sa réponse à Quel est le meilleur: les colonnes d’identité ou les identifiants uniques générés? mrdenny dit:
Lorsque SQL Denali sera disponible, il prendra en charge des séquences plus efficaces que l’identité, mais vous ne pouvez pas créer quelque chose de plus efficace.
Je ne suis pas si sûr. Connaissant les séquences d'Oracle , je dois créer un déclencheur d'insertion, encapsuler chaque insertion dans un appel d'une procédure stockée ou prier pour que je n'oublie pas d'utiliser correctement la séquence lorsque je fais une insertion ad hoc.
Je doute que les avantages des séquences soient si évidents.
sql-server
sql-server-2012
sequence
Bernd_k
la source
la source
Réponses:
Je vais répondre ici aussi. Cela a à voir avec les aspects internes de comment
IDENTITY
et deSEQUENCE
travail.Avec
IDENTITY
, SQL Server met en cache les valeurs en mémoire afin qu’elles soient facilement disponibles. Voir la réponse de Martin Smith pour les détails. Au fur et à mesure que les valeurs sont utilisées, un processus en arrière-plan génère plus de valeurs. Comme vous pouvez l'imaginer, ce pool peut s'épuiser assez rapidement, laissant l'application à la merci du processus d'arrière-plan qui génère les valeurs.Avec
SEQUENCE
, SQL Server vous permet de définir la taille du cache. Bien que SQL Server ne conserve pas les valeurs dans le cache, il ne conserve que la valeur actuelle et la valeur de l'extrémité supérieure, ce qui réduira considérablement la quantité d'E / S nécessaire pour créer des valeurs.Ne définissez pas le cache trop haut, car cela réduirait le nombre de nombres pouvant être utilisés: si SQL Server devait tomber en panne, toutes les valeurs spécifiées dans la plage de cache actuelle non utilisées seraient perdues.
En ce qui concerne l'insertion de ligne, spécifiez simplement une valeur par défaut pour la colonne, comme suit:
la source
Depuis la rédaction de l' article d'Itzik Ben Gan, la taille de la mémoire cache codée en dur de 10
IDENTITY
semble avoir été modifiée. Parmi les commentaires sur cet élément de connexionLe manuel d' interrogation T-SQL contient le tableau suivant, mais souligne que ces valeurs ne sont ni documentées ni garanties d'être inchangées.
L'article ici teste différentes tailles de cache de séquence et de tailles de lot d'insertion et donne les résultats suivants.
Ce qui semble montrer que pour les grands inserts
IDENTITY
out effectueSEQUENCE
. Cependant, il ne teste pas la taille de cache 1 000 et ces résultats ne sont qu'un test. En examinant spécifiquement la taille du cache 1 000 avec différentes tailles de lots d'insertions, j'ai obtenu les résultats suivants (essayer 50 fois la taille de chaque lot et agréger les résultats comme ci-dessous - tous les temps sont en μs.)Pour les lots de plus grande taille, la
IDENTITY
version semble généralement plus rapide .Le manuel TSQL Querying explique également pourquoi
IDENTITY
un avantage en termes de performances est obtenu par rapport à la séquence.La
IDENTITY
table est spécifique etSEQUENCE
ne l'est pas. Si un sinistre devait frapper mi insertion avant que le tampon de journal ne soit vidé, peu importe si l'identité récupérée est antérieure, le processus de récupération annulant également l'insertion, de sorte que SQL Server ne force pas le vidage du tampon de journal pour chaque identité. cache lié disque écrire. Cependant, pour Sequence, ceci est appliqué car la valeur peut être utilisée à n'importe quelle fin, y compris en dehors de la base de données. Ainsi, dans l'exemple ci-dessus, avec un million d'insertions et une taille de cache de 1 000, il s'agit de mille vidages supplémentaires du journal.Script à reproduire
la source