2012-10-18 6 views

Répondre

2

la différence entre avoir plusieurs colonnes dans un seul index non groupé, comparé à avoir plusieurs index non groupés avec chacun ayant une seule colonne dedans?

Considérons une table T avec un clucstered colonne PK Id, et en outre des colonnes A, B, C.

Un seul index non cluster contenant A, B et C pourrait soutenir recherche rapide pour les requêtes telles que:

WHERE A > @a 
WHERE A = @a AND @b1 < B AND B < @b2 
WHERE A = @a AND B = @b AND C < @c 

mais pas

WHERE B = @b 
WHERE C = @c 

dans les deux cas qui, nous ne pouvons pas faire mieux qu'une analyse de table

Cependant, si nous avons plusieurs index, IX_A sur A, etc:

WHERE A = @a 
WHERE B = @b 
WHERE C = @c 

profiterions tous d'un index et une requête composite tel que

WHERE A = @a AND B = @b AND C < @c 

aurait un petit avantage aussi.

0

La requête SELECT que ceux qui optimiseront sont différentes.

Vous ne devez pas ajouter d'index sans avoir besoin d'optimiser les performances de la requête.

Si vous avez une requête à optimiser, vous pouvez commencer à penser à ajouter des index correspondant à la requête que vous souhaitez optimiser.

Disons que vous avez une table contenant la structure suivante:

create table emp 
(
    id int identity primary key clustered, 
    name nvarchar(200), 
    dep_id int, 
    salary int 
); 

Votre index ordonné en clusters (la clause primary key clustered) accéléreront consultation et des données de ligne de récupération pour les requêtes à l'aide de la colonne id comme filtre comme:

select id, name, dep_id, salary 
from emp 
where id = @id 

tout index non cluster sur une colonne (unique) accélérera la consultation (pas t la récupération des données de ligne) en utilisant la même colonne qu'un filtre.

create index emp_name_idx on emp(name); 
-- will speed up look-up for 
select id, dep_id 
from emp 
where name = @name 

Si vous voulez aussi accélérer les données de ligne de récupération en utilisant le même index, vous devrez ajouter les colonnes présentes dans la clause SELECT aux colonnes incluses.

create index emp_name_idx on emp(name) include(id, dep_id); 
-- will speed up look-up and data row retrieval for 
select id, dep_id 
from emp 
where name = @name 

Tout index non cluster contenant des colonnes de multiples accéléreront consultation pour les requêtes en utilisant les n premières colonnes dans le même ordre que dans l'indice (tant que les filtres sont comparaison d'égalité, la la séquence d'optimisation des colonnes se terminera lorsque la première comparaison d'inégalité sera atteinte).

create index emp_namesalary_idx on emp(dep_id, salary); 
-- will speed up look-up and data row retrieval for 
select id, dep_id 
from emp 
where dep_id = @dep_id 
    and salary > @salary 

En ce qui concerne les indices de colonne unique, aussi optimiser la récupération des données de ligne, utilisez la clause include pour indiquer toutes les colonnes dans la clause SELECT qui ne sont pas déjà présentes dans la liste des colonnes d'index. N'oubliez pas que pour chaque index que vous ajoutez à une table, vous ajoutez également INSERT pour cette table. Donc, vous devez toujours équilibrer les performances entre les gains de l'indice sur l'instruction SELECT et les pertes sur les INSERT. Rappelez-vous également que les index utilisent de l'espace disque (et cache) et que cela devrait également compter dans le processus de décision.

+0

J'ai une tonne de requêtes chacun faisant quelque chose d'autre. – user1662812

+0

Ensuite, vous pouvez optimiser chacun de ceux-ci, ou de préférence seulement ceux qui demandent beaucoup de ressources, en fonction de vos besoins de performance d'insertion. Et si vous voulez des conseils sur quel index va accélérer quelle requête, vous devriez commencer à lire les bases de l'indexation. Je vais mettre à jour la réponse pour donner un exemple simple. – Paciv

Questions connexes