我在针对视图运行的 SQL Server 中有一个相当复杂的查询,格式如下:
SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]
ORDER BY sortcode;
如上所示的查询计划显示了Sort
在 final 之前的操作SELECT
,这是我所期望的。只有 35 条匹配记录,查询时间不到 2 秒。
但如果我添加TOP 30
,查询需要将近 3 分钟!使用SET ROWCOUNT
同样缓慢。
查看查询计划,现在似乎在连接和过滤器myview
之前对所有 2+ 百万条记录进行了排序。
这种“排序”在查询计划中显示为索引上的索引扫描、sortcode
主表上的聚集索引查找以及它们之间的嵌套循环,所有这些都在连接和过滤器之前。
我怎样才能强制 SQL Server 到SORT
just before 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
有几千条记录,而mytable
在同一个MSSQL实例中的其他数据库有几百万条记录。两个表在各自的列上都有索引。sortcode