Ich möchte nur sicherstellen, dass ich mit diesen Konzepten auf dem richtigen Weg bin, daher wäre jedes Feedback sehr willkommen.
Hier ist meine Theorie aus der Abfrage, die ich gerade optimiert habe, durch Ausprobieren und Lesen der MSDN-Dokumentation.
Die Abfrage
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)
Der Index
CREATE NONCLUSTERED INDEX [IX_tbl_pics] ON [dbo].[tbl_pics]
(
[map_id] ASC,
[deleted] ASC,
[pic_date] DESC
)
INCLUDE ( [hidden], [pic_id] )
Es gibt auch einen PK-Index für pic_id
Die Theorie
Die Schlüsselspalten sind so, weil sie entweder in einer WHERE-Klausel (aber nicht in einer OR-Situation) oder in ORDER BY verwendet werden.
Die Nichtschlüsselspalten (INCLUDE) als solche, weil sie in WHERE verwendet werden, aber weil sie in einem ODER-Szenario verwendet werden, können sie keine Schlüsselspalte sein (können nicht = werden die Leistung nicht verbessern).
Sind diese Annahmen richtig? Wenn nicht, was vermisse ich?
Vielen Dank!
quelle