我将此查询作为存储过程:
SELECT ID
FROM dbo.tblRentalUnit
WHERE (NOT EXISTS
(SELECT 1 AS Expr1
FROM dbo.tblTenant
WHERE (dbo.tblRentalUnit.ID = UnitID)))
在Microsoft SQL Server Management Studio Express中,它在16毫秒内执行。当我在Visual Studio 2008自动生成的类型化数据集中使用它时,它在64,453毫秒内执行。超过一分钟。
估计和执行计划如下:
Select [0%] <- Filter [1%] <- Merge Join (Left Outer Join) [28%] <- Index Scan [16%] <- Sort [43%] <- Clustered Index Scan [12%]
为什么这里存在差异,我该如何纠正呢?
答案 0 :(得分:2)
这听起来像是一个错误缓存的查询计划。
您的索引和统计信息是最新的吗?
BTW,如果tblTenant.UnitId是tblRentalUnit.ID的Foriegn Key 然后您的查询可以重写为:
SELECT ru.ID
FROM
dbo.tblRentalUnit ru
LEFT JOIN dbo.tblTenant t ON ru.ID = t.UnitID
WHERE
t.UnitID IS NULL
答案 1 :(得分:0)
您是否在每次测试之前(从任一客户端)刷新缓冲区?确保在每次测试之间执行DBCC DROPCLEANBUFFERS和DBCC FREEPROCCACHE。
答案 2 :(得分:0)
tblRentalUnit.ID是否正确编入索引?