Existe-t-il une règle absolue pour décider quelles colonnes et dans quel ordre elles doivent être placées dans Inclus dans index non clusterisé. Je venais de lire ce post https://stackoverflow.com/questions/1307990/why-use-the-include-clause-when-creating-an-index et j'ai constaté que pour la requête suivante:
SELECT EmployeeID, DepartmentID, LastName
FROM Employee
WHERE DepartmentID = 5
Le poster a suggéré de faire un index comme ceci:
CREATE NONCLUSTERED INDEX NC_EmpDep
ON Employee(EmployeeID, DepartmentID)
INCLUDE (Lastname)
voici ma question pourquoi ne pouvons-nous pas faire un index comme celui-ci
CREATE NONCLUSTERED INDEX NC_EmpDep
ON Employee( EmployeeID, DepartmentID, LastName)
ou
CREATE NONCLUSTERED INDEX NC_EmpDep
ON Employee( EmployeeID, LastName)
INCLUDE (DepartmentID)
et quoi amène l'affiche à décider de conserver la colonne Nom de famille incluse. Pourquoi pas d'autres colonnes? et comment décider dans quel ordre nous devrions garder les colonnes là?
sql-server
sql-server-2005
sql-server-2008
index
Communauté
la source
la source
Réponses:
Cette suggestion d'index par marc_s est fausse. J'ai ajouté un commentaire. (Et c'était ma réponse acceptée aussi!)
L'index pour cette requête serait
Un index est typiquement
Où:
WHERE, JOIN, ORDER BY, GROUP BY, etc.
la source
NonKeyColList
ordre n'a pas d'importance.KeyColList
ordre devrait être dans l'ordre de fréquence, vous vous attendez à ce qu'ils soient utilisés dans les requêtes. Voir mes notes sur ma réponse ci-dessous, mais c'est commeLast Name, First Name, Middile Initial
dans un annuaire téléphonique. Vous avez besoin du premier champ pour trouver le deuxième champ.JNK et gbn ont donné d'excellentes réponses, mais il convient également d'envisager la situation dans son ensemble - pas seulement en se concentrant sur une seule requête. Bien que cette requête particulière puisse bénéficier d'un index (# 1):
Cet index n'aide pas du tout si la requête change légèrement, par exemple:
Cela aurait besoin de l'index (# 2):
Imaginez que vous avez 1 000 employés dans le département 5. À l'aide de l'index n ° 1, pour trouver tous les Smiths, vous devez parcourir les 1 000 lignes du département 5, car les colonnes incluses ne font pas partie de la clé. En utilisant l'index n ° 2, vous pouvez rechercher directement le département 5, Nom Smith.
L'index n ° 2 est donc plus utile pour traiter un plus grand nombre de requêtes - mais le coût est une clé d'index plus volumineuse, ce qui agrandit les pages non-feuilles de l'index. Chaque système sera différent, il n'y a donc pas de règle empirique ici.
Notez également que si EmployeeID était la clé de clustering de cette table (en supposant un index clusterisé), vous n'avez pas besoin d'inclure EmployeeID - il est présent dans tous les index non clusterisés, ce qui signifie que l'index n ° 2 pourrait simplement être
la source
Je ne sais pas comment tu as eu ce premier. Pour moi, pour cette requête, j'utiliserais:
Il n'y a pas de "règle absolue" pour pratiquement tout ce qui concerne SQL.
Mais, pour votre exemple, le seul champ utilisé par l'index est
DepartmentID
parce qu'il se trouve dans laWHERE
clause.Les autres champs doivent simplement être facilement accessibles à partir de là. Vous sélectionner en fonction
DepartmentID
puisINCLUDE
a ces champs au niveau du noeud de feuille de l'index.Vous ne voulez pas utiliser vos autres exemples car ils ne fonctionneraient pas pour cet index.
Pensez à un index comme un annuaire téléphonique. La plupart des annuaires sont classés par nom de famille, prénom, initiale. Si vous connaissez le prénom d'une personne, mais pas son nom de famille, l'annuaire ne vous sert à rien, car vous ne pouvez pas rechercher le prénom en fonction de l'ordre de son index.
Les
INCLUDE
champs ressemblent au numéro de téléphone, à l'adresse, etc., ainsi qu'à d'autres informations pour chaque entrée du livre.MODIFIER:
Pour clarifier davantage pourquoi ne pas utiliser:
Cet indice est utile si vous avez soit
EmployeeID
ou BOTHEmployeeID
etLastName
dans votreWHERE
article. C'est à peu près l' opposé de ce dont vous avez besoin pour cette requête.la source
Je pense que vous pourrez toujours utiliser l'index (employee_id, department_id), mais vous devrez inclure une ligne "factice" dans la phrase where, comme: "employee_id = employee_id)
Utilisez le "vieux" tricK?
select * from Employee emp
où emp.employee_id = emp.employee_id
et emp.department_id = 5
(Donc, je ne me concentre pas sur la partie include de Lastname, mais sur le yes / ou la non-utilisation de la clé.)
Sincères amitiés,
Miguell
la source