我只想确保我在这些概念上走的正确,所以任何反馈将不胜感激。
这是我根据刚刚经过优化的查询通过反复试验并阅读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情况)或and ORDER BY。
非键(INCLUDE)列之所以如此,是因为它们在WHERE中使用,但是由于它们在OR场景中使用,因此它们不能(不能=不会提高性能)成为键列。
这些推论正确吗?如果没有,我想念什么?
谢谢!