【发布时间】:2017-03-03 00:41:56
【问题描述】:
谢谢你帮助我。我有我从中选择的索引视图。我创建了一个非聚集索引,但查询有 WHERE 谓词和 ORDER BY 要求。如果我将 WHERE 中的列放在索引上,那么 ORDER BY 很慢,反之亦然。我能找到的最好的方法是混合,但速度并不是我想要的。
例如是这样的:
SELECT apple, banana
FROM indexViewFood
WHERE pickingDate BETWEEN '09/01/2016' AND '10/02/2016'
AND aid IN (1,2,3,4)
AND bid IN (11,12,13,14)
ORDER BY apple, banana
现在,我有pickDate的索引,然后是apple:
CREATE INDEX ix_food ON (pickingDate, apple) INCLUDE (banana, aid, bid)
索引查找的成本为 3%,而排序的成本为 90%。如果我放一个(aid,pickDate)的索引,执行时间会更长。
查询必须按这些名称排序。真正的查询从多个表中选择作为左连接。所有额外的数据都必须减慢排序操作。当前运行时间为五分钟。
我可以尝试其他索引组合吗?当涉及到 WHERE 和 ORDER By 组合时,我可以尝试其他方法吗?再次感谢您
【问题讨论】:
-
您是否尝试过使用索引调整向导?
-
是的,有时我不相信它。 (aid,pickDate)的索引比我现在的要慢
-
未过滤视图返回多少行?查询返回多少行?
-
我在创建索引视图时已经添加了过滤器。当我进行测试时,我添加了所有参数。所以总行数是 9,855,256
-
尝试索引采摘日期、苹果、香蕉,包括辅助和出价。 PickingDate 将帮助过滤器,apple,banana 将强制扫描中的排序顺序(因此不需要单独的排序步骤),并且包括辅助和投标将使索引无需任何主键查找即可使用
标签: sql-server indexing sql-order-by query-optimization where