0

让我们直接来看这个例子:

查询一:

Select * 
Into #temp_v1 
From View1

Select * 
Into #temp_v2
From View2

select *
From #temp_v1 v1
where not exists (
    Select * From #temp_v2 where key = v1.key
)

这比

查询 2:

select *
From View1 v1
where not exists (
    Select * From View2 where key = v1.key
)

现在,显然,我已经简化了这个例子。View1 是视图的视图,需要进行更多比较,这使得使用连接变得困难。

我的问题实际上不是我应该如何编写我的 SQL,而是 SQL Server 为何能在 3 秒内执行查询 1,并在 10 分钟内执行查询 2。

更重要的是,有一个神奇的选项,我可以让优化器创建一个像查询 1 这样的执行计划。

4

1 回答 1

1

如果您的视图很复杂,那么访问视图将是迄今为止操作中最慢的部分,而查询 1 将其最小化。

假设每个视图有 1,000,000 行。在查询 1 中,您仅从视图中检索一行 2,000,000 次,而在查询 2 中,您可能从视图中检索一行 500,000,000,000 次或更多。(在最佳情况下,每个都v1.key将存在于视图 2 中。但您仍然必须每次检查视图 2 中大约一半的行以验证这一点)。

我不知道 SQL Server 中的执行计划,但是像这样编写查询也应该更有效:

with keys as (
   select key from View2
)
select *
From View1 v1
where not exists (
    Select * From keys where key = keys.key
)

通过提前从视图 2 中获取所有键,您基本上可以获得与查询 1 相同的效率,而无需临时表步骤。

于 2012-10-19T12:09:49.700 回答