Je veux juste m'assurer que je suis sur la bonne voie avec ces concepts, donc tout commentaire serait grandement apprécié.
Voici ma théorie de la requête que je viens d'optimiser, à travers un processus d'essais et d'erreurs et la lecture de la documentation MSDN.
La requête
DECLARE @pic_id int
SET pic_id = 1
SELECT ROW_NUMBER() OVER (ORDER BY pic_date desc) AS row_num, *
FROM tbl_pics
WHERE deleted = 0 AND map_id = 1 AND (hidden = 0 OR pic_id = @pic_id)
L'index
CREATE NONCLUSTERED INDEX [IX_tbl_pics] ON [dbo].[tbl_pics]
(
[map_id] ASC,
[deleted] ASC,
[pic_date] DESC
)
INCLUDE ( [hidden], [pic_id] )
Il y a aussi un index PK sur pic_id
La théorie
Les colonnes clés le sont, car elles sont utilisées dans une clause WHERE (mais pas dans une situation OR) ou dans ORDER BY.
Les colonnes non clés (INCLUDE) en tant que telles, car elles sont utilisées dans le WHERE, mais parce qu'elles sont utilisées dans un scénario OU, elles ne peuvent pas (ne peuvent pas = n'améliorer pas les performances) être une colonne clé.
Ces présomptions sont-elles correctes? Sinon, que me manque-t-il?
Merci!