lit*_*een 12 sql-server-2008 sql-server
SQL Server 2008 R2 查询优化器拼图
我们有两个表,都包含 900 万行。70.000 行不同,其他相同。
这很快,13秒,
select * from bigtable1
except select * from similar_bigtable2
Run Code Online (Sandbox Code Playgroud)
这对输出进行排序并且也很快,13 秒,
select * into #q from bigtable1
except select * from similar_bigtable2
select * from #q order by sort_column
Run Code Online (Sandbox Code Playgroud)
虽然这非常缓慢:
;with q as (
select * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
Run Code Online (Sandbox Code Playgroud)
甚至我有时用来提示 SQL Server 需要预先计算查询的某个部分才能继续执行的“技巧”也不起作用并导致查询速度变慢:
;with q as (
select top 100 percent * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
Run Code Online (Sandbox Code Playgroud)
查看查询计划不难发现原因:

SQL Server在哈希匹配之前放置了两种 900 万行,而我希望它在哈希匹配之后只添加一种 70.000 行。
所以问题是:我如何指示查询优化器这样做?
试试这个,有更好的吗?
select * from
(
select * from bigtable1
except
select * from similar_bigtable2
) t
order by sort_column
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2869 次 |
| 最近记录: |