Published on

August 23, 2018

Оптимальный запрос в SQL Server: TOP 0 или WHERE 1 = 2?

Вы когда-нибудь задавались вопросом, какой запрос более оптимальный в SQL Server – использование TOP 0 или WHERE 1 = 2? Этот вопрос часто задают в различных организациях и даже на собеседованиях. Сегодня мы исследуем эту тему и найдем ответ.

Давайте начнем с выполнения двух запросов:

SET STATISTICS IO ON
GO
-- Тест 1
SELECT TOP 0 *
FROM [AdventureWorks2014].[Sales].[SalesOrderDetail]
GO
-- Тест 2
SELECT *
FROM [AdventureWorks2014].[Sales].[SalesOrderDetail]
WHERE 1 = 2
GO

Когда вы выполните оба этих запроса, вы заметите, что они не возвращают никаких результатов. Это потому, что и TOP 0, и WHERE 1 = 2 предотвращают получение данных запросом. Кроме того, если вы изучите план выполнения, вы увидите, что оба запроса имеют одинаковую стоимость.

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

Теперь давайте добавим еще один запрос в качестве теста к исходной проблеме:

-- Тест 3
SELECT *
FROM [AdventureWorks2014].[Sales].[SalesOrderDetail]
WHERE 1 <> 1
GO

Итак, какой запрос, по вашему мнению, будет выполняться быстрее – TOP 0, WHERE 1 = 2 или WHERE 1 <> 1? Ответ может вас удивить. Все три запроса будут иметь одинаковое время выполнения, потому что они все приводят к отсутствию получения данных. Оптимизатор запросов распознает это и оптимизирует план выполнения соответствующим образом.

В заключение, и TOP 0, и WHERE 1 = 2 эквивалентны с точки зрения производительности. Они оба предотвращают возвращение результатов запроса, и оптимизатор запросов обрабатывает их одинаковым образом. Так что, в следующий раз, когда вы столкнетесь с этим вопросом, вы можете уверенно сказать, что они оба оптимальны.

Спасибо за чтение! Если у вас есть дополнительные вопросы или темы, которые вы хотели бы, чтобы мы рассмотрели, не стесняйтесь оставить комментарий ниже.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.