为什么此存储过程在Management Studio中快速执行,而不是在应用程序中执行?

时间:2009-05-26 13:50:50

标签: c# strongly-typed-dataset sql-server-2005-express

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

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%]

为什么这里存在差异,我该如何纠正呢?

3 个答案:

答案 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是否正确编入索引?