【发布时间】:2011-09-11 07:47:57
【问题描述】:
我在 SQL Server 中针对视图运行了一个相当复杂的查询,格式如下:
SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]
ORDER BY sortcode;
如上所示的查询计划在最终的SELECT 之前显示了Sort 操作,这是我所期望的。只有 35 条匹配记录,查询时间不到 2 秒。
但是如果我添加TOP 30,查询大约需要3分钟!使用SET ROWCOUNT 一样慢。
查看查询计划,它现在似乎对myview 中的所有 2+ 百万条记录进行了排序在连接和过滤器之前。
这种“排序”在查询计划中显示为对sortcode 索引的索引扫描、主表上的聚集索引搜索以及它们之间的嵌套循环,所有这些都在连接和过滤器之前。
如何强制 SQL Server 使用 SORT 就在 TOP 之前,就像未指定 TOP 时一样?
我认为myview 的构造不是问题,但以防万一,它是这样的:
CREATE VIEW myview AS
SELECT columns..., sortcode, 0 as shared FROM mytable
UNION ALL
SELECT columns..., sortcode, 1 as shared FROM [anotherdb].dbo.mytable
本地mytable有几千条记录,而同一个MSSQL实例中另一个数据库中的mytable有几百万条记录。两个表在各自的sortcode 列上都有索引。
【问题讨论】:
-
那么,您查询中的
WHERE shared=1实际上取消了UNION视图的第一部分? -
@ypercube,是的,在这个特定查询的情况下。
-
如果您发布查询的整个
[joins and other stuff]部分不会有什么坏处。也许缺少其他一些索引是导致优化器走慢路的原因。
标签: sql-server sql-server-2005 tsql sql-execution-plan query-hints