La question porte sur le serveur SQL 2000, mais pour le bénéfice des personnes qui développent sur la dernière version, je vais d'abord l'aborder.
SQL Server 2014
En plus des méthodes d'ajout d'index basés sur des contraintes présentées ci-dessous, SQL Server 2014 permet également de spécifier des index non uniques directement avec une syntaxe en ligne sur les déclarations de variables de table.
Voici un exemple de syntaxe pour cela.
/*SQL Server 2014+ compatible inline index syntax*/
DECLARE @T TABLE (
C1 INT INDEX IX1 CLUSTERED, /*Single column indexes can be declared next to the column*/
C2 INT INDEX IX2 NONCLUSTERED,
INDEX IX3 NONCLUSTERED(C1,C2) /*Example composite index*/
);
Les index filtrés et les index avec des colonnes incluses ne peuvent actuellement pas être déclarés avec cette syntaxe, mais SQL Server 2016 assouplit encore un peu plus la situation. Depuis CTP 3.1, il est désormais possible de déclarer des index filtrés pour les variables de table. Avec la RTM, il mai Il se peut que les colonnes incluses soient également autorisées, mais la position actuelle est qu'elles ne sont pas autorisées. "ne sera probablement pas intégré à SQL16 en raison de contraintes de ressources".
/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)
SQL Server 2000 - 2012
Puis-je créer un index sur le nom ?
Réponse courte : Oui.
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
Vous trouverez ci-dessous une réponse plus détaillée.
Les tables traditionnelles dans SQL Server peuvent soit avoir un index en cluster, soit être structurées en tant que amas .
Les index en grappe peuvent être déclarés uniques pour empêcher la duplication des valeurs des clés ou non uniques par défaut. S'ils ne sont pas uniques, le serveur SQL ajoute silencieusement un élément uniqueifier à toute clé dupliquée pour la rendre unique.
Les index non clusterisés peuvent également être déclarés explicitement comme uniques. Sinon, pour le cas non unique, le serveur SQL ajoute le localisateur de ligne (clé d'indexation en grappe ou RID pour un tas) à toutes les clés de l'index (pas seulement les doublons), ce qui garantit à nouveau qu'elles sont uniques.
Dans les versions 2000 à 2012 de SQL Server, les index sur les variables de table ne peuvent être créés que de manière implicite en créant un fichier UNIQUE
o PRIMARY KEY
contrainte. La différence entre ces types de contraintes est que la clé primaire doit porter sur une ou plusieurs colonnes non annulables. Les colonnes participant à une contrainte unique peuvent être nullables. (bien que l'implémentation des contraintes uniques par le serveur SQL en présence d'une clé primaire puisse être nulle). NULL
n'est pas conforme à celle spécifiée dans la norme SQL). De plus, une table ne peut avoir qu'une seule clé primaire mais plusieurs contraintes uniques.
Ces deux contraintes logiques sont physiquement mises en œuvre avec un index unique. Si cela n'est pas explicitement spécifié, l'index PRIMARY KEY
deviendra l'index clusterisé et les contraintes uniques non clusterisées mais ce comportement peut être modifié en spécifiant CLUSTERED
o NONCLUSTERED
explicitement avec la déclaration de la contrainte (exemple de syntaxe)
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
En conséquence de ce qui précède, les index suivants peuvent être créés implicitement sur les variables de table dans SQL Server 2000 - 2012.
+-------------------------------------+-------------------------------------+
| Index Type | Can be created on a table variable? |
+-------------------------------------+-------------------------------------+
| Unique Clustered Index | Yes |
| Nonunique Clustered Index | |
| Unique NCI on a heap | Yes |
| Non Unique NCI on a heap | |
| Unique NCI on a clustered index | Yes |
| Non Unique NCI on a clustered index | Yes |
+-------------------------------------+-------------------------------------+
Le dernier point nécessite un peu d'explication. Dans le tableau de définition des variables au début de cette réponse, la variable non unique index non clusterisé sur Name
est simulée par un unique index sur Name,Id
(rappelons que SQL Server ajouterait silencieusement la clé de l'index clusterisé à la clé NCI non unique de toute façon).
Un index en grappe non unique peut également être obtenu en ajoutant manuellement un élément de type IDENTITY
pour servir d'identificateur unique.
DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
Mais ce n'est pas une simulation précise de la façon dont un index clusterisé non unique serait normalement mis en œuvre dans SQL Server, car cela ajoute le "Uniqueifier" à toutes les lignes. Pas seulement à celles qui le nécessitent.
4 votes
La création de ces deux types de tables temporaires a un coût ; et si vous avez tellement de données dans cette table que vous avez besoin d'un index, il est peut-être temps d'envisager l'utilisation d'une table réelle, que vous configurez de manière à ce qu'elle soit sécurisée pour les transactions, que vous filtrez par identifiant ou identifiant d'utilisateur et que vous effacez à la fin. Les tables réelles et les tables temporaires ont toutes deux leurs avantages et leurs inconvénients, mais si les performances sont un problème, essayez aussi avec une table réelle.
0 votes
Une table temporaire "EST" une vraie table, elle disparaît simplement lorsque vous avez terminé. La vraie différence (à part qu'elle disparaît automatiquement) est qu'elle se trouve dans TempDB. C'est en fait énorme quand il s'agit d'index et de contraintes, car vous pourriez vous retrouver avec des conflits de noms, non seulement avec d'autres exécutions de votre code, mais aussi avec du code exécuté dans d'autres bases de données de votre instance.
1 votes
@bielawski il s'agit d'une table variable et non d'une table temporaire. Les variables de table ne permettent pas de nommer explicitement les contraintes, les noms générés par le système sont garantis uniques. Elles autorisent les index nommés à partir de 2014 mais ce n'est pas un problème car les index doivent être nommés de manière unique au sein d'un objet et non entre les objets.
0 votes
Mon point de vue était double. 1) A part l'utilisation d'une variable pour éviter l'enchevêtrement des transactions, il n'y a pas de différence matérielle entre une table temporaire et une table variable. Dans V-2000 cependant, il n'y a pas de syntaxe pour ajouter des contraintes, des index... à une variable. 2) Étant donné que l'on peut utiliser une table temporaire à la place, les appendices de table nommés comme les index... WILL se heurter à l'exécution simultanée de copies du même SP si un nom statique est utilisé ! Le mécanisme ci-dessous a été développé explicitement parce que j'ai tracé des échecs de SP à des index nommés entrant en conflit dans ces circonstances exactes. Ils DOIVENT être uniques.
1 votes
@bielawski - Non indice les noms n'ont pas besoin d'être uniques entre les objets - seuls les noms des contraintes doivent l'être. Il est facile de tester cela. Il suffit d'exécuter
CREATE TABLE #T1(X INT); CREATE TABLE #T2(X INT); CREATE INDEX IX ON #T1(X); CREATE INDEX IX ON #T2(X);
0 votes
Et vous pouvez télécharger 2000 BOL à partir de microsoft.com/fr/download/details.aspx?id=51958 - Le
CREATE INDEX
États thématiques i.stack.imgur.com/xwhpc.png