SQL: выполняется ли основной или вспомогательный запрос?

Предполагая, что у меня есть таблица «MyTable», которая содержит 10 000 записей; когда я запускаю запрос ниже, чтобы получить только 25 записей: выбирает ли он все 10 000 записей прежде, чем вернуть только 25 из них, или будет автоматически оптимизирован запрос парсером SQL?

SELECT *
FROM
   (
    SELECT HPE.ID, 
           HPE.EventTitle, 
           HPE.EventDate, 
           HPE.EventLocation, 
           HPE.SortOrder,
           CASE HPE.FlagShowInShop
               WHEN 1 THEN 'Yes'
               ELSE 'No'
           END AS FlagShowInShop, 
           HPE.ShowFrom, 
           HPE.ShowTo, 
           HPE.FK_Language, 
           HPE.FK_Region, 
           ISNULL (EG.Name, 'BIG EVENTS') AS EventGenre, 
           ROW_NUMBER () OVER
                              (ORDER BY HPE.FK_EventGenre_Value, 
                                        HPE.SortOrder
                              ) AS RowNum
      FROM [MyTable] AS HPE
           LEFT JOIN [MySecondTable] AS EG ON HPE.FK_EventGenre_Value=EG.Value
   ) AS HomePageEventsWithRowNumber
WHERE RowNum BETWEEN 1 AND 25

sql,sql-server,

1

Ответов: 1


2

В вашем случае внутренний выбор должен быть выполнен, чтобы найти строки с 1 по 25. Но - если есть индекс, и это можно предсказать - я бы предположил, что внешний запрос будет принят во внимание. Если двигатель может предсказать 25 рядов frist, он попытается уменьшить работу.

Что бы вы ни делали или не проверяли, нет уверенного предсказания. Вы можете проверить план выполнения и выяснить, который выполняется первым, но в следующий раз (или с другой версией SQL Server) это может быть другим.

SQL Server не является процедурным механизмом

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

Сначала будет выполняться подвыбор (возможно), если его значения нужны где-то во внешнем запросе. Если внешний запрос позволяет значительно сократить основные строки с заданным фильтром, двигатель (возможно) будет связывать дочерние строки как можно позже.

Это зависит от многих обстоятельств, которые вы не можете полностью контролировать.

Что вы могли бы сделать, но на самом деле следует избегать:

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

Но - почти всегда - об этом нельзя даже думать. Двигатель действительно работает довольно эффективно ...

Приходите в яркий свет настроенного мышления!

SQL, SQL-сервер,
Похожие вопросы