1

我将此查询作为存储过程:

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 毫秒。超过一分钟。

估计和执行计划是这样的:

选择 [0%] <- 过滤 [1%] <- 合并连接(左外连接)[28%] <- 索引扫描 [16%]
                                                                 <- 排序 [43%] <- 聚集索引扫描 [12%]

为什么这里有这种差异,我该如何纠正?

4

3 回答 3

2

这听起来像是一个错误缓存的查询计划。

您的索引和统计数据是最新的吗?

顺便说一句,如果 tblTenant.UnitId 是 tblRentalUnit.ID 的外键,那么您的查询可以重写为:

SELECT ru.ID    
FROM         
    dbo.tblRentalUnit ru
    LEFT JOIN dbo.tblTenant t ON ru.ID = t.UnitID
WHERE
    t.UnitID IS NULL
于 2009-05-26T14:03:09.817 回答
0

您是否在每次测试之前(从任一客户端)刷新缓冲区?确保在每个测试之间执行 DBCC DROPCLEANBUFFERS 和 DBCC FREEPROCCACHE。

于 2009-05-26T14:07:31.493 回答
0

tblRentalUnit.ID 是否正确编入索引?

于 2009-05-26T14:19:46.743 回答