为什么我的 ORDER BY 在 EXCEPT 之前(慢)而不是之后(快)对两个表进行排序?

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)

查看查询计划不难发现原因:

查询计划 带有 ORDER BY 的查询计划

SQL Server在哈希匹配之前放置了两种 900 万行,而我希望它在哈希匹配之后只添加一种 70.000 行。

所以问题是:我如何指示查询优化器这样做?

Gor*_*ell 0

试试这个,有更好的吗?

select * from
(
    select * from bigtable1
    except 
    select * from similar_bigtable2
) t
order by sort_column
Run Code Online (Sandbox Code Playgroud)