Solo quiero asegurarme de que estoy en el camino correcto con estos conceptos, por lo que cualquier comentario sería muy apreciado.
Aquí está mi teoría de la consulta que acabo de optimizar, a través de un proceso de prueba y error y leyendo la documentación de MSDN.
La consulta
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)
El índice
CREATE NONCLUSTERED INDEX [IX_tbl_pics] ON [dbo].[tbl_pics]
(
[map_id] ASC,
[deleted] ASC,
[pic_date] DESC
)
INCLUDE ( [hidden], [pic_id] )
También hay un índice PK en pic_id
La teoría
Las columnas clave son así, porque se usan en una cláusula WHERE (pero no en una situación OR) o en ORDER BY.
Las columnas sin clave (INCLUIR) como tal, porque se usan en el DÓNDE, pero porque se usan en un escenario OR no pueden (no pueden = no mejorarán el rendimiento) ser una columna clave.
¿Son correctas estas presunciones? Si no, ¿qué me estoy perdiendo?
¡Gracias!
fuente