2009-05-26 6 views
1

У меня есть этот запрос в качестве хранимой процедуры:Почему эта хранимая процедура выполняется быстро в Management Studio, но не в приложении?

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

Если вам нужна дополнительная информация об установке, пожалуйста, дайте мне знать! – Malfist

+0

Почему это проголосовали? – Malfist

+0

Возможно, что-то связано с голубым небом, зеленой травой и солнцем, поднимающимся на восток. – TheTXI

ответ

2

Это звучит неправильно запрограммированный план запросов.

Ваши данные и статистика в актуальном состоянии?

Кстати, если tblTenant.UnitId является Foriegn ключ в 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

Как проверить и посмотреть, обновлены ли мои индексы и статистика? По свойствам базы данных они автоматически обновляются – Malfist

+0

Переключение на этот запрос и установка ARITHABORT ON; снизило время выполнения до 5859 мс в приложении, но оно все равно не совпадает с тем, как оно будет выполняться в Management Studio – Malfist

+0

В SSMS ознакомьтесь с планами оценки и фактического исполнения различий (возможно, здесь) –

0

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

+0

Убедитесь, что это не производственная коробка! ;) –

+0

Я сделал это, это не производственная коробка :) – Malfist

0

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

+0

да. Все индексируется, все в этом запросе действует только на индексы. – Malfist

+0

Инфраструктура «Все» может быть частью проблемы. Как вы настроили свои индексы? – andrewbadera

 Смежные вопросы

  • Нет связанных вопросов^_^