ТОП 100 вызывает зависание SQL Server 2008? - PullRequest
0 голосов
/ 19 февраля 2011

Я унаследовал ОЧЕНЬ плохо спроектированную и обслуживаемую базу данных и использовал свои знания SQL Server и немного удачи, поддерживая этот сервер HIGH Availability и не заканчивая сгореть в огне (предыдущий разработчик, который ушел, по сути, просто держалсистема работала 4 года).

Сегодня я столкнулся с очень странной проблемой.Я надеюсь, что кто-то может объяснить мне это, поэтому, если это случится снова, есть способ исправить это.

В любом случае, есть сохраненный процесс, который довольно прост.Он объединяет две таблицы между коротким диапазоном даты / времени (диапазон 5 минут) и передает результаты обратно (этот запрос выполняется каждые 5 минут через службу Windows).Самая большая таблица имеет 100 тысяч строк, самая маленькая таблица имеет 10 тысяч строк.Хранимая процедура очень проста:

ПРИМЕЧАНИЕ. Имена таблиц и столбцов были изменены, чтобы защитить невинных.

SELECT TOP 100 m.*
FROM dbo.mytable1 m WITH (nolock)
INNER JOIN dbo.mytable2 s WITH (nolock) ON m.Table2ID = s.Table2ID
WHERE m.RowActive = 1
      AND s.DateStarted <= DATEADD(minute, -5, getdate())
ORDER BY m.DateStarted

Теперь, если я оставлю "TOP 100" взапрос, запрос зависает до тех пор, пока я не остановлю его (работает в SMS или в сохраненном процессе).Если я удаляю TOP 100, запрос работает как запланировано и возвращает 50-ти строчные строки, как и должно быть (мы не хотим, чтобы он возвращал более 100 строк, если мы можем помочь).

Итак,Я провел некоторое исследование, используя sp_who, sp_who2, и посмотрел на master..sysprocesses и использовал DBCC INPUTBUFFER для поиска любых SPID, которые могут быть блокирующими или блокирующими.Без блоков и без блокировок.

Это ТОЛЬКО НАЧИНАЕТСЯ сегодня без изменений в этих двух схемах таблиц и из того, что я понял в последний раз, когда этот запрос / таблицы обрабатывался 3 года назад и работал без ошибок.с тех пор.

Теперь, примечание, и я не знаю, будет ли это как-то связано с этим.Но я переиндексировал обе эти таблицы примерно 24 часа назад, потому что они были фрагментированы на 99% (помните, я говорил, что это плохо спроектированный и плохо обслуживаемый сервер).

Кто-нибудь может объяснить, почему SQL Server 2008 будет делать это?

Ответы [ 3 ]

3 голосов
/ 08 октября 2013

ORDER BY является убийцей.он должен прочитать все строки, отсортировать их по столбцам и затем получить первые 100 строк.

2 голосов
/ 19 февраля 2011

Абсолютно первое, что я хотел бы сделать, - это сделать параллельное сравнение планов запросов для полных и первых 100 запросов и посмотреть, не являются ли первые 100 неэффективными. Вам может потребоваться обновить статистику или даже пропустить индексы.

0 голосов
/ 19 февраля 2011

Я бы предположил, что на mytable1 нет индекса. DateStarted.Я думаю, что-то может быть решено выполнить сортировку ранее в процессе запроса, когда вы сделали SELECT TOP 100.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...