2009-05-28 4 views
1

Nous avons une table appelée table1 ...SQL Performance Index

(c1 int indentity,c2 datetime not null,c3 varchar(50) not null, 
    c4 varchar(50) not null,c5 int not null,c6 int ,c7 int) 

on column c1 is primary key(clusterd Index) 
on column c2 is index_2(Nonclusterd) 
on column c3 is index_2(Nonclusterd) 
on column c4 is index_2(Nonclusterd) 
on column c5 is index_2(Nonclusterd) 

Il contient 10 millions de disques. Nous avons plusieurs procédures pointant vers « table1 » avec différents critères de recherche:

select from table1 where c1=blah..and c2= blah.. and c3=blah.. 
select from table1 where c2=blah..and c3= blah.. and c4=blah.. 
select from table1 where c1=blah..and c3= blah.. and c5=blah.. 
select from table1 where c1=blah.. 
select from table1 where c2=blah.. 
select from table1 where c3=blah.. 
select from table1 where c4=blah.. 
select from table1 where c5=blah.. 

Quelle est la meilleure façon de créer un index non-cluster à part ci-dessus, ou de modifier les index existants pour obtenir une bonne performance de l'indice et de réduire le temps d'exécution ?

+0

Dans vos exemples de requête, tous les prédicats sont des tests d'égalité d'une colonne à une seule valeur. Et plusieurs prédicats sont toujours combinés avec un opérateur AND. Je confirme juste que c'est le cas. Que vos requêtes n'utilisent pas les prédicats LIKE ou les opérateurs OU ou les références de colonne enveloppantes dans les fonctions. – spencer7593

+0

Qu'en est-il de la clause select? Toujours le même nombre de colonnes? – gbn

+0

La façon dont vous avez exprimé vos index est un peu déroutante - dites-vous que vous avez deux index (un en cluster sur c1, un en cluster sur c2, c3, c4, c5), ou dites-vous que vous avez 5 indices (un cluster sur c1, un non-cluster sur chacun de c2, c3, c4, c5)? –

Répondre

6

Et maintenant, pour répondre réellement ...

L'astuce ici est que vous avez une seule colonne lookups sur un certain nombre de colonnes, ainsi que des colonnes composites lookups. Vous devez comprendre avec quelle fréquence les requêtes ci-dessus s'exécutent - pour celles qui sont exécutées très rarement, vous devriez probablement les exclure de vos considérations d'indexation.

Vous pouvez mieux vaut créer des NCIX uniques sur chacune des colonnes interrogées. Ce serait probablement le cas si le nombre de lignes renvoyées est très petit, car les NCIX seraient capables de gérer les requêtes "single lookup" ainsi que les recherches composites. Alternativement, vous pouvez créer des NCIX à colonne unique en plus de couvrant des index composites - encore une fois, le facteur décisif étant la fréquence d'exécution et le nombre de résultats renvoyés.

+2

Gardez également à l'esprit que si vous avez un index sur (c1, c2) alors vous avez très rarement besoin d'un sur (c1). –

+0

si la fréquence pour les colonnes individuelles et combinées est également très élevée. Les index séparés sont bien ou nous devons créer des index composites aussi selon les conditions de recherche – rmdussa

+0

qu'advient-il de la performance? si je crée index_6 sur (c1, c2, c3) et index_7 sur (c2, c3, c4) et index_8 sur (c1, c3, c5)? – rmdussa

0

C'est un peu dur de répondre avec juste l'information que vous avez fournie. Il y a d'autres facteurs que vous devez peser.

Par exemple: À quelle fréquence la table est-elle mise à jour et quelles colonnes sont fréquemment mises à jour? Vous devrez payer un coût pour ces mises à jour en raison de la maintenance de l'index.

Quelle est la cardinalité de vos différentes colonnes? Quelles requêtes exécutez-vous le plus souvent et quelles colonnes apparaissent dans la clause where de ces requêtes?

Vous devez d'abord déterminer quels sont vos paramètres de performance acceptable pour chacune de vos requêtes et travailler en tenant compte de ce que j'ai mentionné ci-dessus.

Avec 10 millions de lignes, le partitionnement de votre table peut être très logique ici.

0

Avez-vous pensé à utiliser le composant de recherche plein texte de MSSQL. Il pourrait offrir la performance que vous recherchez?

Questions connexes