web-dev-qa-db-fra.com

Séquence vs identité

SQL Server 2012 a introduit Sequence en tant que nouvelle fonctionnalité, comme dans Oracle et Postgres. Où les séquences sont préférées aux identités? Et pourquoi avons-nous besoin de séquences?

76
Sleiman Jneidi

Je pense que vous trouverez votre réponse ici

En utilisant l'attribut d'identité d'une colonne, vous pouvez facilement générer des nombres auto-incrémentés (qui sont aussi souvent utilisés comme clé primaire). Avec Séquence, ce sera un objet différent que vous pourrez attacher à une colonne de tableau lors de l'insertion. Contrairement à identity, le numéro suivant pour la valeur de la colonne sera extrait de la mémoire plutôt que du disque, ce qui rend Sequence bien plus rapide que Identity. Nous verrons cela dans les exemples à venir.

Et ici :

Séquences: des séquences sont demandées par la communauté SQL Server depuis des années et sont incluses dans cette version. Séquence est un objet défini par l'utilisateur qui génère une séquence d'un nombre. Voici un exemple utilisant Séquence.

et ici aussi:

Un objet séquence SQL Server génère une séquence de nombres, tout comme une colonne d’identité dans des tables SQL. Mais l'avantage des numéros de séquence est que l'objet numéro de séquence n'est pas limité à une seule table SQL.

et sur msdn, vous pouvez également en savoir plus sur l'utilisation et pourquoi nous en avons besoin ( here ):

Une séquence est un objet lié au schéma défini par l'utilisateur qui génère une séquence de valeurs numériques conformément à la spécification avec laquelle la séquence a été créée. La séquence de valeurs numériques est générée dans un ordre croissant ou décroissant à un intervalle défini et peut être répétée selon la demande. Les séquences, contrairement aux colonnes d'identité, ne sont pas associées aux tables. Une application fait référence à un objet séquence pour recevoir sa valeur suivante. La relation entre les séquences et les tables est contrôlée par l'application. Les applications utilisateur peuvent référencer un objet séquence et coordonner les clés de valeurs sur plusieurs lignes et tableaux.

Une séquence est créée indépendamment des tables à l'aide de l'instruction CREATE SEQUENCE. Les options vous permettent de contrôler l'incrément, les valeurs maximales et minimales, le point de départ, la capacité de redémarrage automatique et la mise en cache pour améliorer les performances. Pour plus d'informations sur les options, voir CREATE SEQUENCE.

Contrairement aux valeurs de colonne d'identité, générées lors de l'insertion de lignes, une application peut obtenir le numéro de séquence suivant avant l'insertion de la ligne en appelant la fonction NEXT VALUE FOR. Le numéro de séquence est attribué lorsque NEXT VALUE FOR est appelé même si le numéro n'est jamais inséré dans une table. La fonction NEXT VALUE FOR peut être utilisée comme valeur par défaut pour une colonne dans une définition de table. Utilisez sp_sequence_get_range pour obtenir une plage de plusieurs numéros de séquence à la fois.

Une séquence peut être définie comme n'importe quel type de données entier. Si le type de données n'est pas spécifié, la séquence par défaut est bigint.

70
Arion

La séquence et l’identité sont toutes deux utilisées pour générer un numéro automatique, mais la différence principale est que l’identité dépend de la table et que la séquence est indépendante de la table.

Si vous avez un scénario dans lequel vous devez conserver un numéro automatique globalement (dans plusieurs tables), vous devez également redémarrer votre intervalle après un numéro particulier et vous devez également le mettre en cache pour des performances optimales. identité.

Vous trouverez ci-dessous les articles définissant l’exemple concret de séquence, sa mise en oeuvre et la différence entre séquence et identité.

http://raresql.com/2012/04/29/how-sequence-works-in-sql-server-2012/http://raresql.com/2012/05/01/différence-entre-identité-et-séquence /

19
user1059637

Bien que les séquences offrent plus de souplesse que les colonnes d’identité, je n’ai pas trouvé d’avantages en termes de performances.

J'ai constaté que les performances utilisant une identité étaient systématiquement trois fois plus rapides que l'utilisation d'une séquence pour des insertions par lots.

J'ai inséré environ 1,5 millions de lignes et la performance était:

  • 14 secondes pour l'identité
  • 45 secondes pour la séquence

J'ai inséré les lignes dans une table utilisant un objet sequence via une table par défaut:

NEXT VALUE for <seq> for <col_name>

et a également essayé de spécifier la valeur de séquence dans l'instruction select:

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

Les deux étaient le même facteur plus lent que la méthode de l'identité. J'ai utilisé l'option de cache par défaut pour la séquence.

L'article référencé dans le premier lien d'Arion montre les performances d'insertion ligne par ligne et la différence entre identité et séquence était de 16,6 secondes à 14,3 secondes pour 10 000 insertions.

L'option Caching a un impact important sur les performances, mais l'identité est plus rapide pour les volumes plus importants (+ 1 million de lignes).

Voir ceci lien pour une analyse approfondie selon le commentaire de utly4life.

12
Stagg

Je sais que c'est un peu vieux, mais je voulais ajouter une observation qui m'a mordue.

Je suis passé d'identité en séquence pour avoir mes index en ordre. J'ai découvert par la suite que la séquence n'était pas transférée avec la réplication. J'ai commencé à avoir des violations de clés après avoir configuré la réplication entre deux bases de données car les séquences n'étaient pas synchronisées. juste quelque chose à surveiller avant de prendre une décision.

3
Ken

Récemment, quelque chose à prendre en compte pour identité vs séquence. Semble que MSFT suggère maintenant la séquence si vous souhaitez conserver l’identité sans lacunes. Nous avons eu un problème où il y avait d'énormes lacunes dans l'identité, mais sur la base de cette déclaration, cela expliquerait notre problème selon lequel SQL a caché l'identité et après le redémarrage, nous avons perdu ces chiffres.

https://docs.Microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

Valeurs consécutives après le redémarrage du serveur ou d'autres défaillances - SQL Server peut mettre en cache les valeurs d'identité pour des raisons de performances et certaines des valeurs attribuées peuvent être perdues lors d'une défaillance de la base de données ou du redémarrage du serveur. Cela peut entraîner des lacunes dans la valeur d'identité lors de l'insertion. Si les lacunes ne sont pas acceptables, l'application doit utiliser son propre mécanisme pour générer des valeurs de clé. L'utilisation d'un générateur de séquence avec l'option NOCACHE peut limiter les lacunes dans les transactions qui ne sont jamais validées.

1
awilbourn

Je trouve que l'utilisation optimale de Sequences ne consiste pas à remplacer une colonne d'identité, mais à créer un type de champ "Numéro de commande".

En d'autres termes, un numéro de commande est exposé à l'utilisateur final et peut comporter des règles commerciales. Vous voulez que ce soit unique, mais utiliser une colonne d'identité n'est pas non plus correct.

Par exemple, différents types d'ordre peuvent nécessiter une séquence différente. Vous pouvez donc avoir une séquence pour Ordre Internet, par opposition aux ordres internes.

En d'autres termes, ne considérez pas une séquence comme un simple substitut d'identité, mais plutôt comme utile dans les cas où une identité ne correspond pas aux exigences de l'entreprise.

0
Greg Gum