В SQL Server, автоматически ли оптимизируются подзапросы? - PullRequest
0 голосов
/ 20 января 2020

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

У меня есть случай, когда мне нужно получить записей через нумерацию страниц: только 9 записей на каждой странице.

У меня есть подзапрос, который извлекает все строки из таблицы users (> 10000 строк), и в запросе с конвертированием я применяю нумерацию страниц следующим образом:

select * 
from
    (select firstname, lastname, age
     from users)  -- returns > 10,000 rows
order by lastname asc
offset 0 rows fetch next 9 rows only

Теперь, опять же, пожалуйста, игнорируйте, почему это написано таким образом, мой вопрос больше о понимании того, как SQL Сервер оптимизирует запросы: SQL Сервер фактически выполняет подзапрос, а затем возвращает весь сначала набор результатов, затем фильтрует его до первых 9 строк, что, конечно, отрицательно влияет на производительность, ИЛИ, каким-то образом оптимизирует ли он его, поэтому ему никогда не придется возвращать весь набор результатов, что приводит к той же производительности, если не было подзапроса?

Я переписал запрос, чтобы он был более прямым, как показано ниже:

select firstname, lastname, age
from users
order by lastname asc
offset 0 rows fetch next 9 rows only

еще предстоит К моему удивлению, я не заметил ЭТОГО улучшения производительности, что заставило меня задуматься, может быть, SQL Сервер выполняет свою собственную негласную оптимизацию?

У кого-нибудь есть какие-нибудь подсказки?

1 Ответ

1 голос
/ 20 января 2020

SQL является описательным языком, а не процедурным языком. SQL запрос описывает производимые результаты. Он не указывает, КАК эти результаты рассчитаны.

Это функция компилятора и оптимизатора. На самом деле исполняемый код не похож на оригинальный оператор SQL. Технически это называется DAG (направленный график ацикли c). И он использует кучу примитивных операторов, которые вы не узнаете. Часто трудно определить, что в исходном запросе соответствует определенному оператору.

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

Обратите внимание, что все базы данных работают таким образом. Однако не все оптимизаторы равны. Таким образом, если вы используете подзапросы в MySQL (более старые версии) или MS Access, то вы можете обнаружить заметную разницу в производительности.

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