2009-05-06 6 views
3

Je crée un index dans sql server 2005 et la discussion avec un collègue est si elle fait une différence entre les colonnes de clé d'index étant id et date vs date puis id.Existe-t-il une différence entre id, date ou date, id index dans SQL Server

Y a-t-il une différence fondamentale dans la façon dont l'index serait créé dans l'un ou l'autre scénario?

Cela ferait-il une différence dans les autres versions de SQL Server?

Merci

Répondre

8

Oui, définitivement. Quelqu'un a-t-il jamais interrogé la table pour JUST date ou JUST id? Un indice de ce jour, id peut être utilisé pour rechercher la date juste, mais pas seulement id, et vice-versa

par date, id:

Jan 1  4 
Jan 1  7 
Jan 2  6 
Jan 2  9 
Jan 2  33 
Jan 3  23 
Jan 4  1 

Utilisation de id, date:

1  Jan 4 
4  Jan 1 
6  Jan 2 
7  Jan 1 
9  Jan 2 
23 Jan 3 
33 Jan 2 

Si votre clause WHERE ou JOIN dans votre requête utilise à la fois date et id, alors l'index est correct. Mais vous pouvez voir que si vous faites une recherche juste par date, le premier index est utile pour cela, mais le second est totalement aléatoire. Dans un sens plus général, un index sur A, B, C, D va être utile pour les requêtes sur A, B, C, D, ou A, B, C ou A, B ou juste A.

+0

Ce n'était pas ce qu'il demandait ... Sauf erreur de lecture, il demande si l'ordre des colonnes dans un index composé de Date et ID est important. La performance d'un index Date-ID est-elle supérieure à celle d'un index ID-Date? – TheTXI

+0

La révision rend ce que vous dites beaucoup plus compréhensible. +1 – TheTXI

3

L'ordre des colonnes est important lorsqu'il s'agit d'index. Cela dépend ou non de votre cas.

Laissez-moi vous expliquer. Disons que vous avez une table de personnes, avec le prénom, le dernier et le deuxième prénom.

Vous créez donc cet index, les colonnes dans l'ordre suivant:

FirstName, MiddleName, LastName 

Maintenant, disons que vous faites maintenant une requête en utilisant une clause WHERE sur toutes ces colonnes. Il va utiliser l'index entier. Mais, disons que vous ne faites qu'une requête sur le prénom et le nom, ce qui se passe maintenant est que, tout en continuant à utiliser la requête, il saisira la plage de l'index qui a le même prénom que votre clause WHERE, Ensuite, scannez-les, récupérant ceux qui ont un nom de famille correspondant. Notez, il va scanner toutes les lignes avec le même prénom.

Cependant, si vous aviez réarrangé l'indice, comme celui-ci:

FirstName, LastName, MiddleName 

Ensuite, la requête ci-dessus saisirait la plage de l'indice qui a le même nom et prénom, et récupérer ceux-ci.

Il est plus facile à saisir si vous le regardez d'une autre manière.

Le répertoire est trié par nom de famille, puis par prénom et par deuxième prénom. Si vous aviez mis le deuxième prénom entre le prénom et le nom, et que les personnes ayant le même prénom et le même nom seraient apparemment partout, simplement parce que vous avez trié le prénom avant le prénom.Par conséquent, si vous cherchez mon nom, qui est "Lasse Vågsæther Karlsen", vous trouverez tous les Karlsen-personnes, nous serions dans une liste séquentielle dans l'annuaire téléphonique, mais mon nom serait être placé au hasard, simplement parce que la liste serait alors triée par Vågsæther.

Ainsi, un index peut être utilisé, même si la requête n'utilise pas toutes les colonnes de l'index, mais les fonctions de recherche rapide ne fonctionnent que tant que les colonnes sont listées au début de l'index. Une fois que vous avez ignoré une colonne, une sorte de scan a lieu. Maintenant, si toutes vos requêtes utilisent à la fois l'identifiant et la date, peu importe, mais si toutes les requêtes incluent la date, et que certaines d'entre elles contiennent un identifiant, alors je mettrais la date d'abord, et l'identifiant Deuxièmement, de cette façon, l'indice serait utilisé dans plus de cas.

0

Oui, c'est important. Supposons que vous créez un index sur les colonnes (A, B). Vous pouvez faire un SELECT avec une clause WHERE incluant les deux colonnes et l'index peut être utilisé. L'index sera également utilisé si vous faites un SELECT avec un WHERE qui inclut seulement la colonne A. Mais si vous faites un SELECT avec un WHERE qui n'inclut que la colonne B, l'index ne peut pas être utilisé. Pour plus d'informations, voir here.

Questions connexes