Order by字段有时看到SQL SERVER给出的索引中会加在索引的Include里面,我则比较喜欢加在条件字段的尾部,今日测试对比了一下。
有一个查询语句如下:
SELECT TOP 5 id,name,BizOfferTypeId,TradingServiceType FROM [table] WITH (NOLOCK)
WHERE ((gameid='5865420422194d68947c3d4b79a83204')) ORDER BY CreatedDate DESC
创建了如下索引:
create index ix_120302_test on [table](gameid,CreatedDate)
include(id,name,BizOfferTypeId,TradingServiceType) with(online=on) on idx1
执行结果如下:
表 。扫描计数 17,逻辑读取 6620 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
然后创建了如下索引:
create index ix_120302_test on [BizOfferSearchBy040E](gameid,CreatedDate)
include(id,name,BizOfferTypeId,TradingServiceType) with(online=on) on idx1
表 。扫描计数 1,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
两者重要的区别是执行计划发生了较大的该表,使用第一种索引的时候,排序占用了不少的资源,第二种省去了排序的环节。这可能类似于Mysql 中排序算法的区别,是
先 排序再返回数据,还是先返回数据,再排序。很明显,先排序再返回数据对IO优化有益。