视图比选择慢得多

时间:2012-10-19 11:57:39

标签: sql sql-server

让我们直截了当地说明:

查询1:

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这样的执行计划。

1 个答案:

答案 0 :(得分:1)

如果你的视图很复杂,那么到目前为止,访问视图将是操作中最慢的部分,而查询1最小化了这一点。

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

我不知道SQL服务器中的执行计划,但写这样的查询也应该更有效:

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

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