Столбец ORDER BY, для которого разрешено пустое значение, работает медленно. Зачем? - PullRequest
2 голосов
/ 21 апреля 2011

Так что на самом деле мой вопрос ПОЧЕМУ это сработало.

В любом случае, у меня был этот запрос, который выполняет несколько внутренних объединений, имеет предложение where и выполняет упорядочение по столбцу nvarchar. Если я выполняю запрос БЕЗ порядка, запрос занимает меньше секунды. Если я выполняю запрос WITH по порядку, это занимает 12 секунд.

Теперь у меня была отличная идея, и я изменил все ВНУТРЕННИЕ СОЕДИНЕНИЯ на ВЛЕВОЕ СОЕДИНЕНИЯ. А также включил предложение ORDER BY. Это заняло меньше секунды. Поэтому я вспомнил разницу между левыми и внутренними соединениями. ВНУТРЕННИЕ СОЕДИНЕНИЯ проверяют наличие NULL, а ЛЕВЫЕ СОЕДИНЕНИЯ - нет. Поэтому я пошел в дизайн таблицы и снял флажок «Разрешить нули». Теперь я выполняю запрос WITH INNER JOINs и предложение ORDER BY, и запрос занимает меньше секунды. ПОЧЕМУ?

Из того, что я понимаю, сначала должны выполняться предложения FROM, JOINS, WHERE, затем SELECT и возвращать набор результатов. Затем предложение ORDER BY выполняется в самом конце результирующего набора записей. Поэтому запрос должен занимать AT MOST секунду, да, даже если столбец допускает нулевые значения. Так почему же запрос будет занимать менее секунды БЕЗ заказа по предложению, но займет 12 секунд с заказом по предложению? Это не имеет смысла для меня.

Запрос ниже:

SELECT PlanInfo.PlanId, PlanName, COALESCE(tResponsible, '') AS tResponsible, Processor, CustName, TaskCategoryId, MapId, tEnd,
CASE MapId WHEN 9 THEN 1 ELSE 2 END AS sor
FROM PlanInfo INNER JOIN [orders].dbo.BaanOrders_Ext ON PlanInfo.PlanName = [orders].dbo.BaanOrders_Ext.OrderNo
INNER JOIN [orders].dbo.BaanOrders ON PlanInfo.PlanName = [orders].dbo.BaanOrders.OrderNo
INNER JOIN Tasks ON PlanInfo.PlanId = Tasks.PlanId
INNER JOIN EngSchedToTimingMap ON Tasks.CatId = EngSchedToTimingMap.TaskCategoryId
WHERE (MapId = 9 OR MapId = 11 or MapId = 13 or MapId = 15)
AND([orders].dbo.BaanOrders_Ext.Processor = 'metest' OR tResponsible = 'metest')
ORDER BY PlanInfo.PlanId

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

Когда вы используете предложение ORDER BY, вы заставляете ядро ​​базы данных сортировать результаты.Это занимает некоторое время (особенно если результат содержит много строк) - поэтому возможно, что запрос, который выполняется 1 секунду без предложения ORDER BY, выполняется с ним в течение 12 секунд.Обратите внимание, что сортировка занимает в лучшем случае O (N * log (N)), где N - это число строк.

Причина, по которой значения NULL, как правило, медленные, заключается в том, что с ними нужно обращаться особенно.Сортировка с NULL добавляет более сложные условия сравнения и замедляет сортировку.

2 голосов
/ 21 апреля 2011

Я бы предположил, что это связано с наличием индекса PlanInfo.PlanId, по которому вы сортируете.

SQL Server может упростить сбор, чтобы он следовал за индексом и строил оставшуюся частьстолбцы вдоль этого порядка.Когда поле имеет значение NULLable, индекс не может использоваться для сортировки, поскольку он не будет содержать значений NULL, которые случайно появляются первыми, поэтому он решает оптимизировать его по другому пути.

Показ плана выполнения всегда помогает,Либо вставьте изображения планов, либо просто покажите планы в текстовом режиме, т.е. добавьте строку над запросом, а затем выполните его

SET SHOWPLAN_TEXT ON;
<the query>
0 голосов
/ 21 апреля 2011

Если ваш вопрос «Почему предложение ORDER BY заставляет мой запрос выполняться дольше?»ответ заключается в том, что сортировка результатов добавляется в план выполнения запроса.

Если вы используете инструмент «Показать примерный план выполнения запроса» в SQL Server Studio, он покажет вам именно то, что он считает механизм SQL Serverбудет делать.

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