让我们直截了当地说明:
查询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这样的执行计划。
答案 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相同的效率,而无需临时表步骤。