SQL Server: почему эти запросы возвращают разные наборы результатов? - PullRequest
1 голос
/ 11 августа 2009

Запрос 1 = выберите топ 5 i.item_id из ITEMS i

Запрос 2 = выбрать топ 5 i.item_id, i.category_id из ITEMS i

Даже если я удаляю 5 лучших предложений, они все равно возвращают разные строки.

если я запускаю «выберите топ 5 i. * Из ITEMS i», это возвращает совершенно другой набор результатов !!

Ответы [ 4 ]

7 голосов
/ 11 августа 2009

Поскольку результаты квалифицированного SELECT "TOP N" являются неопределенными, если у вас нет предложения ORDER BY.

3 голосов
/ 11 августа 2009

Поскольку вы не указываете предложение ORDER BY, оптимизатор определит наиболее эффективный способ выполнения запроса, который вы запрашиваете. Это означает, что для двух столбцов, которые вы указали в двух запросах, может выполняться различная индексация, что приводит к тому, что вы видите.

3 голосов
/ 11 августа 2009

Без предложения ORDER BY вы не можете предсказать, в каком порядке вы получите результаты. Вероятно, есть интересная основная причина того, почему SQL Server обрабатывает эти запросы по-разному, но с точки зрения пользователя решение состоит в том, чтобы просто наложить предложение ORDER BY, которое относится к вашему запросу, таким образом гарантируя, что вы будете знать, какие пять элементов стоят первыми.

2 голосов
/ 11 августа 2009

Причина проста: вы не указали предложение ORDER BY. Так, например, оптимизатор мог бы выбрать использование разных индексов для удовлетворения двух разных запросов, если существует обедненный индекс, который содержит ItemID, но не CategoryID, его можно коснуться, чтобы удовлетворить первый запрос. Очень распространенный вопрос, имеющий консервированный насвер:

Без ORDER BY порядок сортировки по умолчанию отсутствует.

...