Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Странное поведение выражения с TOP


Автор: fvoice 26.7.2010, 08:41
Приветствую,

не выполняется следующий запрос на серваке:
Код

select TOP 18 id, BIN, RNN, Names, JuridicalAddress, IsProducer, IsConsumer, row from 
(select id, BIN, RNN, Names, JuridicalAddress, IsProducer, IsConsumer, ROW_NUMBER() OVER(ORDER BY Id) as row 
from companies where id not in ( select distinct c.id from companies c 
inner join purchaseplans p on p.companyid = c.id where (p.createddate < '12.31.2010' and p.createddate > '01.01.2010'))) as q 
where q.row > 0


во время выполнения System Cache достигает 14 Гб, PageFile тоже порядка 14 Гб, средняя загрузка по 16 процам 30%, но запрос таки не возвращает результатов, просто висит.

в то же время такой же запрос, но без TOP 18 выполняется за доли секунды, и возвращает ~1600 строк

На локальной же машине, на тестовой БД(которая кончено в разы меньше), запрос тоже выполняется доли секунды, что с TOP, что без него..

В чем может быть причина столь странного поведения SQL сервака?

Автор: Zloxa 26.7.2010, 09:16
1. Какой смысл в TOP без order by?
2. При каком раскладе может не выполниться условие  q.row > 0. Т.е. при каком раскладе ROW_NUMBER() может дать не положительные числа?

А вообще ответ на Ваш вопрос кроется в плане запроса, его отличии от плана запроса без top, который Вы не привели.

Автор: fvoice 26.7.2010, 09:20
PurchasePlans содержит порядка 5 млн записей,
если смотреть Execution Plan то Clustered Index Scan занимает 100%

Автор: Zloxa 26.7.2010, 09:24
очень информативно. smile 
При данном стечении обстоятельств, однозначно можно утверждать что ошибка в 17й строке smile 

Автор: fvoice 26.7.2010, 09:31
а разве "OVER(ORDER BY Id)" не сортирует по id?

планы запросов с TOP и без TOP значительно отличаются по количеству "ходов", но время-затраты не сильно отличаются:

у запроса без TOP Clustered Index Scan для PurchasePlans  - 96%(против 100% с TOP), Hash Match и Parallelism по 1%, куда делись еще 2 процента непонятно.

Добавлено через 1 минуту и 39 секунд
я пишу информацию которую могу получить, я слабо знаком со средствами для анализа запросов, поэтому буду рад если вы подскажите как мне провести анализ, или на что обратить внимание

Автор: Zloxa 26.7.2010, 09:34
Цитата(fvoice @  26.7.2010,  09:31 Найти цитируемый пост)
 "OVER(ORDER BY Id)" не сортирует по id?

нет
Вернее сервер может быть и отсортирует, но вовсе не обязан возвращать результат в этом порядке.
Цитата(fvoice @  26.7.2010,  09:31 Найти цитируемый пост)
планы запросов с TOP и без TOP значительно отличаются

это все и объясняет!
это и есть ответ на Ваш вопрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)