Je suis en train d'ajouter des index non clusterisés à SQL Azure DB et je me demande quelle est la différence entre avoir plusieurs colonnes dans un seul index non cluster, par rapport à ayant plusieurs index non groupés avec chacun une seule colonne dedans?Index non cluster sur plusieurs colonnes VS plusieurs colonnes dans un même index
Répondre
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.
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.
- 1. Entity Framework Index cluster-many-many vs. index non-cluster
- 2. index MySQL plusieurs colonnes
- 3. index de plusieurs colonnes vs index pour chaque col? MySQL
- 4. Index de plusieurs colonnes sur un champ hérité non substitué
- 5. index mysql de plusieurs colonnes
- 6. Base de données - Index sur plusieurs colonnes
- 7. Ordre des colonnes dans un index à plusieurs colonnes MySQL
- 8. Index pour plusieurs colonnes dans ActiveRecord
- 9. Inclure plusieurs colonnes dans un seul index dans Postgres
- 10. performances Oracle avec plusieurs index mêmes colonnes
- 11. colonnes incluses pour un index non-clustered
- 12. Optimisation des index de plusieurs colonnes pour plusieurs requêtes de colonnes sur SQL Server
- 13. Index Oracle avec plusieurs colonnes interrogeant sur une seule colonne
- 14. Zend Lucene & Symfony: un grand index vs plusieurs index multiples
- 15. Dois-je utiliser plusieurs colonnes index SQL Server dans le même ordre que je le déclare?
- 16. MySQL - Ajout de colonnes INDEXES à un index plusieurs seveurs
- 17. MySQL 2 colonnes index
- 18. l'option de requête mysql « entre » dans « index à plusieurs colonnes »
- 19. MySQL: clé auto-générée personnalisée (AUTO_INCREMENT/index à plusieurs colonnes)
- 20. Comment créer un index clusterisé sur plusieurs colonnes à l'aide de hibernate
- 21. Question MySQL: Index sur les colonnes!
- 22. accès à l'index par index non cluster
- 23. Index en cluster ou index non cluster sur une colonne de clé non principale?
- 24. Comment changer l'ordre des colonnes dans un index à plusieurs colonnes en utilisant fluent-nhibernate?
- 25. colonne json vs plusieurs colonnes
- 26. filtrage SQL par plusieurs colonnes avec des index
- 27. jQuery sélectionner plusieurs colonnes de table par index
- 28. Créer rails index pour interroger plusieurs colonnes avec daterange
- 29. Ordre d'index sur plusieurs colonnes
- 30. Oracle NLS_UPPER Index Colonnes
J'ai une tonne de requêtes chacun faisant quelque chose d'autre. – user1662812
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