2010-10-04 4 views
2

SQL Server 2008 работает на Windows Server Enterprise (?) Издание 2008SQL Server ORDER BY Performance аберрация

У меня есть запрос присоединения к двадцати некоторых-нечетные таблицы (в основном LEFT OUTER JOIN и). Полный набор данных, возвращаемый нефильтрованным запросом, возвращает менее 1000 строк менее чем за 1 секунду. Когда я применяю предложение WHERE для фильтрации запроса, он возвращает менее 300 строк менее чем за 1 секунду.

Когда я применяю предложение ORDER BY к запросу, оно возвращается в 90-х годах.

Я изучил результаты запроса и заметил ряд результатов NULL, возвращаемых в столбце, который используется для сортировки. Я изменил запрос на COALESCE на значение NULL на допустимое значение поиска без каких-либо изменений в производительности запроса.

Я тогда сделал

SELECT * FROM 
(
my query goes here 
) qry 
ORDER BY myOrderByHere 

И получают те же результаты.

Когда я ВЫБИРАЮ ... INTO #tempTable (без ORDER BY), а затем SELECT FROM #tempTable с порядком запроса возвращает менее чем за 1 секунду.

На самом деле странно, что SELECT ... INTO также займет 90 секунд даже без ORDER BY.

В плане выполнения указано, что SORT занимает 98% времени выполнения, когда он включен в основной запрос. Если я выполняю INSERT INTO, в плане объяснения говорится, что фактическая вставка в временную таблицу занимает 99% времени выполнения.

И, чтобы устранить проблемы с сервером, я выполнил те же тесты в двух разных экземплярах SQL Server 2008 с почти одинаковыми результатами.

Большое спасибо!

операции rjsjr

ответ

0

Своего рода, как правило, является дорогостоящим шагом в запросе. Поэтому неудивительно, что добавление сортировки добавляет время. Вы можете видеть похожие результаты, когда вы включаете временную таблицу в свои шаги. Операция сортировки в исходном запросе может использовать tempdb, чтобы помочь выполнить сортировку, и это может быть отнимающим много времени шагом в каждом запросе, который вы сравниваете.

Если вы хотите узнать больше о каждом запущенном запросе, вы можете просмотреть выходы плана запроса.

1

Похоже, что что-то странное происходит с вашим tempdb. Вставка 1000 строк во временную таблицу должна быть быстрой, будь то неявная катушка для сортировки или явная select into.

Проверьте размер вашего данных TempDb, здоровье жесткого диска он включен, и это модель восстановления (должна быть simple, не full или bulk logged.)

+0

На моем Dev/тестовый сервер временной базы данных является 400MB большой и имеет Доступно 400 МБ пространства. В разделе «Восстановление» я вижу, что параметр «Проверка страницы» установлен на «CHECKSUM». Я убедился, что файл журнала был усечен и повторно запускал тесты без каких-либо изменений в результатах. Я также попытался переместить основную часть запроса в VIEW и выполнить SELECT и ORDER на этом представлении. Это дает те же результаты. –