2015-01-14 5 views
1

Создал следующий скрипт для загрузки учетных записей пользователей. Использовала строку параметров для имени пользователя при первоначальном тестировании в студии управления. Нечетная вещь после того, как я изменился с строки параметров на строковый литерал, запрос замедлился на 20 секунд. Разве это не так, как правило, для нюхания параметров? Я пробовал DBCC FREEPROCCACHE и создал хранимую процедуру с настройкой некоторых локальных варов, но это не ускорило запрос. Какие-либо предложения?Параметр предложения SQL Where быстрее, чем строковый литерал. Как мне исправить?

DECLARE @accntRep VARCHAR(50) 
SET @accntRep = 'someUserName' 

SELECT accntRep,transBalance FROM companyView AS cv 
OUTER APPLY 
    (SELECT SUM(CASE WHEN pastdue > 0 THEN balance ELSE 0 END) AS pastDueBalance, 
     SUM(balance) AS transBalance FROM pastDueView WHERE compID = cv.compID 
    ) AS balance 
WHERE 
-- accntRep = @accntRep 
accntRep = 'someUserName' 
GROUP BY accntRep,transBalance 
+0

Восстановительный индекс работал. Я чувствую себя немного глупо. Спасибо что подметил это. – user1777129

ответ

2

Разница между строковым литералом и локальной переменной обычно является проблемой статистики, в которой использование локальной переменной использует среднее распределение. Поэтому, если среднее значение лучше, чем фактическая статистика (при условии, что индекс существует в поле [accntRep]), то это звучит так, как будто ваша статистика устарела. По крайней мере обновление статистики. Или вы можете сделать REBUILD индекса, который, пока индекс не разбит на разделы, будет включать в себя обновление статистики WITH FULLSCAN (до SQL Server 2012 секционированные индексы также получили полное обновление статистики).

+1

восстановление индекс работал. Должен был сначала проверить это. Спасибо за помощь. Поскольку индекс был только что восстановлен в воскресенье, я не думал попробовать это. – user1777129

+0

upvoted. Надеюсь, я сделал это правильно. – user1777129