Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Разное время выполнения одного запроса  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Добрый день!
Есть запрос к базе:
DECLARE @usiID smallint

SELECT 1 AS idx, otName, COUNT(*), dbo.RashodLCheckDocHand(Otdel.rowguid) As Days, dbo.iusName(RashodL.usiID) As usName, RashodL.usiID, ralKey
FROM RashodL WITH(noLock)
    INNER JOIN Otdel WITH(noLock) ON RashodL.otUID = Otdel.rowguid
WHERE ralKey & 6 = 2
    AND RashodL.usiID = @usiID
GROUP BY otName, Otdel.rowguid, RashodL.usiID, ralKey

UNION

SELECT 2, otName, COUNT(*), dbo.RashodLCheckDocHand(Otdel.rowguid) As Days, dbo.iusName(RashodL.usiID) As usName, RashodL.usiID, ralKey
FROM RashodL WITH(noLock)
    INNER JOIN Otdel WITH(noLock) ON RashodL.otUID = Otdel.rowguid
WHERE ralKey & 6 = 2
    AND RashodL.usiID <> @usiID
GROUP BY otName, Otdel.rowguid, RashodL.usiID, ralKey
ORDER BY idx, Days DESC


Если его выполнять в Management Studio - выполняется меньше 1 сек. Но если он вызывается из ASP.NET (как процедура) - то выполнение может занимать несколько минут :(

Почему такая разница в скорости работы?
25 апр 12, 14:39    [12469281]     Ответить | Цитировать Сообщить модератору
 Re: Разное время выполнения одного запроса  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
saszay,
можно почитать
тут
тут
тут
25 апр 12, 14:42    [12469307]     Ответить | Цитировать Сообщить модератору
 Re: Разное время выполнения одного запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
saszay,

во-первых, - UNION ALL вместо UNION
во-вторых, - выкинуть бы скалярную UDF.
25 апр 12, 14:57    [12469433]     Ответить | Цитировать Сообщить модератору
 Re: Разное время выполнения одного запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
saszay
Есть запрос к базе:

Этот запрос ничего не должен вернуть
Потому что переменной @usiID не задано значение

Скорее всего то, что вы привели и то, что запускается из ASP.NET сильно различается
Например, в ASP.NET у вас нет никакой параметризации, а есть простая конкатенация текста запроса с внутренними переменными программы
25 апр 12, 15:30    [12469766]     Ответить | Цитировать Сообщить модератору
 Re: Разное время выполнения одного запроса  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Запрос возвращает данные, просто я не указал значение @usiID.
ASP.NET вызывает процедуру, в которой @usiID входной параметр, а тело процедуры - преведённый запрос.
25 апр 12, 15:47    [12469921]     Ответить | Цитировать Сообщить модератору
 Re: Разное время выполнения одного запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
saszay
ASP.NET вызывает процедуру,

Замечательно
Т.е. в Management Studio вы выполняете запрос, а из ASP.NET - процедуру ?
25 апр 12, 15:53    [12469957]     Ответить | Цитировать Сообщить модератору
 Re: Разное время выполнения одного запроса  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
Я привёл запрос из процедуры. Выполняю везде процедуру.
25 апр 12, 17:04    [12470503]     Ответить | Цитировать Сообщить модератору
 Re: Разное время выполнения одного запроса  [new]
alexey17000
Member

Откуда:
Сообщений: 62
А если процедуру из Management Studio запустить. Что будет?
25 апр 12, 17:26    [12470674]     Ответить | Цитировать Сообщить модератору
 Re: Разное время выполнения одного запроса  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 464
0 сек
25 апр 12, 17:33    [12470709]     Ответить | Цитировать Сообщить модератору
 Re: Разное время выполнения одного запроса  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
alexey17000,

сравнивайте настройки подключения, и вобще профайлер вам в помощь.
25 апр 12, 18:32    [12471028]     Ответить | Цитировать Сообщить модератору
 Re: Разное время выполнения одного запроса  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
iap
saszay,
во-первых, - UNION ALL вместо UNION

А мож ему именно уникальные нужно, без повторений?

saszay,
На тему разницы выполнения и сравнения результатов Erland Sommarskog написал огромную замечательную статью в которой расписаны все возможные причины и пути к устранению. Если владеете английским, то рекомендую почитать в оригинале, если нет, то можно в переводе у меня в блоге, ссылки привел denis2710.

Но если лень читать, то вкратце - нельзя "выдергивать" запрос из процедуры и тестировать его производительность как stand alone запроса. Дело в том, что параметры которые вы передаете в процедуру и локальные переменные которые вы используете в "выдернутом" запросе - обрабатываются по-разному, что приводит к разным планам и разному времени выполнения. Подробности по приведенным выше ссылкам.
25 апр 12, 18:59    [12471139]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить