Voglio solo assicurarmi di essere sulla strada giusta con questi concetti, quindi qualsiasi feedback sarebbe molto apprezzato.
Ecco la mia teoria della query che ho appena ottimizzato, attraverso un processo di tentativi ed errori e leggendo la documentazione MSDN.
The Query
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'indice
CREATE NONCLUSTERED INDEX [IX_tbl_pics] ON [dbo].[tbl_pics]
(
[map_id] ASC,
[deleted] ASC,
[pic_date] DESC
)
INCLUDE ( [hidden], [pic_id] )
C'è anche un indice PK su pic_id
La teoria
Le colonne chiave sono così, perché vengono utilizzate in una clausola WHERE (ma non utilizzate in una situazione OR) o ORDER BY.
Le colonne non chiave (INCLUDE) in quanto tali, perché vengono utilizzate in WHERE, ma poiché sono utilizzate in uno scenario OR non possono (non possono = non migliorare le prestazioni) essere una colonna chiave.
Queste presunzioni sono corrette? In caso contrario, cosa mi sto perdendo?
Grazie!