Будет ли "Где 0 = 1" проанализировать полную таблицу или просто вернуть имена столбцов
Я столкнулся с этим вопросом:
SQL Server: выберите Top 0?
Я хочу спросить, использую ли я запрос
SELECT * FROM table WHERE 0=1
или
SELECT TOP 0 * FROM table
он сразу же вернет имена столбцов или продолжит анализ всей таблицы и в конце возвращает нулевые результаты?
У меня есть производственная таблица с 10 000 строк - будет ли она проверять условие WHERE
на каждой строке?
Ответы
Ответ 1
Оптимизатор запросов SQL Server достаточно умен, чтобы понять, что это условие WHERE
может никогда никогда не создавать результат true
в любой строке, поэтому он не беспокоит фактическое сканирование таблицы.
Если вы посмотрите на фактический план выполнения такого запроса, легко увидеть, что ничего не делается, и запрос немедленно возвращается:
![введите описание изображения здесь]()
Ответ 2
MySql достаточно умен, чтобы обнаружить его и знать, что это невозможно сделать.
desc SELECT * FROM table WHERE 0=1;
![enter image description here]()
Ответ 3
В запросе
SELECT * FROM table WHERE 0=1
предложение WHERE
никогда не будет истинным, поэтому SQL Server не будет сканировать всю вашу таблицу.
И в запросе
SELECT TOP 0 * FROM table
вы указываете TOP 0
, поэтому SQL Server очень умный, поэтому он никогда не сканирует вашу таблицу для возврата 0 строк.
Оба запроса возвращают только заголовки столбцов.
Ответ 4
Оба запроса используются для получения пустого набора таблицы;
SELECT TOP 0 * FROM table
SELECT * FROM table WHERE 0=1
Как и для достижения ниже вещей:
- Чтобы получить такую же структуру имени столбца
- Используется для данных столбца возврата, но нет данных
- И хотите, чтобы запрос проверялся на подключение.