Так что на самом деле мой вопрос ПОЧЕМУ это сработало.
В любом случае, у меня был этот запрос, который выполняет несколько внутренних объединений, имеет предложение 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