Почему эта хранимая процедура выполняется быстро в Management Studio, а не в приложении? - PullRequest
1 голос
/ 26 мая 2009

У меня есть этот запрос как хранимая процедура:

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 ]

2 голосов
/ 26 мая 2009

Звучит как неправильно кэшированный план запроса.

Ваши индексы и статистика актуальны?

Кстати, если 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
0 голосов
/ 26 мая 2009

Правильно ли проиндексирован tblRentalUnit.ID?

0 голосов
/ 26 мая 2009

Вы очищали буферы перед каждым тестом (с любого клиента)? Убедитесь, что вы выполняете DBCC DROPCLEANBUFFERS и DBCC FREEPROCCACHE между каждым тестом.

...