私はこれらの概念を正しく理解していることを確認したいだけなので、フィードバックがあれば大歓迎です。
これは、試行錯誤のプロセスとMSDNドキュメントを読んで、最適化したばかりのクエリからの私の理論です。
クエリ
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)
インデックス
CREATE NONCLUSTERED INDEX [IX_tbl_pics] ON [dbo].[tbl_pics]
(
[map_id] ASC,
[deleted] ASC,
[pic_date] DESC
)
INCLUDE ( [hidden], [pic_id] )
pic_idにはPKインデックスもあります。
その理論
キー列は、WHERE句(ORの状況では使用されません)またはORDER BYで使用されるため、そうです。
非キー(INCLUDE)列はWHEREで使用されるためですが、ORシナリオで使用されるため、キー列にすることはできません(パフォーマンスを向上させることはできません)。
これらの推定は正しいですか?そうでない場合、何が欠けていますか?
ありがとう!