L'ordre de la colonne dans la clause where doit-il être identique à l'ordre d'index?

8

Je lisais ce use-the-index-luke.com qui explique en détail comment fonctionnent les index. L'une des choses que cette personne a réitérées est que l'ordre des index est très important et pour accélérer la requête, les colonnes de la clause where doivent être les mêmes que celles de l'index. Aujourd'hui, je viens de corroborer cette théorie et j'ai créé une table (id int, nom nvarchar (100)) sur SQL Server 2008. J'y ai inséré quelque 5000 lignes et créé un index create index abc on test (name, id )

et a tiré la requête

select ID, name 
from test 
where ID = 10
and name = '10'

Je m'attendais à ce qu'une analyse complète de la table soit suivie d'une sélection dans le plan de requête, mais à ma grande surprise, la sortie du plan était une analyse d'index suivie par la sélection. Plan de requête

Donc, ma question est: l'ordre des colonnes dans la clause Where est-il important ou SQL Server les réorganise-t-il conformément à la définition d'index?

Merci !!

Égalitariste
la source
3
Le plan d'exécution de votre test ne répond-il pas à la question?
ypercubeᵀᴹ
Oui !! Mais je voulais un avis d'expert et dans les cas où cela peut échouer. Merci !!
Egalitaire
1
Question similaire pour MySQL: dans MySQL, l'ordre des colonnes dans une clause WHERE affecte-t-il les performances des requêtes? L'optimiseur de SQL-Server est supérieur de quelques niveaux à celui de MySQL.
ypercubeᵀᴹ

Réponses:

13

Donc, ma question est la suivante: l'ordre des colonnes dans la clause Where

Non. L'ordre des colonnes dans la WHEREclause n'a pas d'importance du tout.

un cheval sans nom
la source
10

Tout d'abord, l' DROPinstruction dans la fenêtre de requête n'a clairement pas été exécutée, mais pour des raisons d'explication, je vais essayer de répondre à ce que vous avez demandé.


Pensez aux index comme vous le feriez pour un annuaire: les entrées sont triées par nom, puis par prénom. (Il s'agit de l' ordre des clés d' index .)

Si je vous demande de trouver tous les numéros de téléphone des personnes portant le nom de famille "Davis", vous tournerez la page appropriée et lirez les numéros. (Il s'agit d'une recherche d' index .)

Si je vous demande de trouver tous les numéros de téléphone des personnes portant le prénom «Janice», vous devrez consulter chaque page pour les trouver toutes. (Il s'agit d'un balayage d' index .)

Si je vous donne à la fois un prénom et un nom de famille, vous pourrez trouver cette entrée très rapidement, tout comme le premier exemple, car il est évident que vous utiliseriez le nom de famille pour trouver la bonne page, puis le prénom pour trouver l'entrée exacte. Peu importe l'ordre dans lequel je vous ai donné les informations, tant que je vous ai donné à la fois un prénom et un nom de famille.

L'optimiseur de requêtes SQL Server fonctionne de la même manière. En fonction de l'ordre des clés d'index, il détermine automatiquement le moyen le plus efficace pour récupérer les données que vous avez demandées, quel que soit l'ordre des conditions dans la WHEREclause.

Jon Seigel
la source
Excellente explication sur le balayage d'index et la recherche d'index.
Neelam
0

L'ordre des colonnes sur la matière d'index mais pas dans l'ordre des valeurs andées sur la whereclause.

Gaston Sanchez
la source