Eu só quero ter certeza de que estou no caminho certo com esses conceitos, para que qualquer feedback seja muito apreciado.
Aqui está minha teoria a partir da consulta que acabei de otimizar, através de um processo de tentativa e erro e lendo a documentação do MSDN.
A pergunta
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)
O índice
CREATE NONCLUSTERED INDEX [IX_tbl_pics] ON [dbo].[tbl_pics]
(
[map_id] ASC,
[deleted] ASC,
[pic_date] DESC
)
INCLUDE ( [hidden], [pic_id] )
Há também um índice PK em pic_id
A teoria
As colunas-chave são verdadeiras, porque são usadas em uma cláusula WHERE (mas não em uma situação OR) ou em ORDER BY.
As colunas nonkey (INCLUDE) são assim, porque são usadas no WHERE, mas porque são usadas em um cenário OR, não podem (não podem = não melhorarão o desempenho) ser uma coluna-chave.
Essas presunções estão corretas? Se não, o que estou perdendo?
Obrigado!
fonte