Подтвердить что ты не робот

Как работает SELECT TOP, когда не указан порядок?

msdn documentation говорит, что когда мы пишем

SELECT TOP(N) ..... ORDER BY [COLUMN]

Мы получаем верхние (n) строки, отсортированные по column (asc или desc в зависимости от того, что мы выбираем)

Но если мы не укажем какой-либо порядок, msdn говорит random, как Gail Erickson указал здесь. Он указывает, что он должен быть unspecified, а не random. Но поскольку Thomas Lee указывает, что

Когда TOP используется в сочетании с предложением ORDER BY, результат набор ограничивается первым номером N упорядоченных строк; в противном случае возвращает первое число N строк ramdom

Итак, я выполнил этот запрос в таблице, которая не имеет индексов, сначала я запустил это.

SELECT *
FROM
    sys.objects so
WHERE
    so.object_id NOT IN (SELECT si.object_id
                         FROM
                             sys.index_columns si)
    AND so.type_desc = N'USER_TABLE'

И затем в одной из этих таблиц (на самом деле я попробовал запрос ниже во всех таблицах, возвращаемых вышеуказанным запросом) и Я всегда получал те же строки.

SELECT TOP (2) *
FROM
    MstConfigSettings

Это всегда возвращало те же 2 строки, и то же самое верно для всех других таблиц, возвращаемых запросом 1. Теперь планы выполнения показывают 3 шага.

enter image description here

Как вы можете видеть, нет поиска индекса, это просто чистое сканирование таблицы и

enter image description here

Top показывает фактическое количество строк, равное 2, а также Table Scan; Это не так (там много строк).

Но когда я запускаю что-то вроде

SELECT TOP (2) *
FROM
    MstConfigSettings
ORDER BY
    DefaultItemId

В плане выполнения отображается

enter image description here

и

enter image description here

Итак, когда я не применяю ORDER BY, шаги разные (нет никакого вида). Но вопрос в том, как работает этот Top, когда нет Sort и почему и как он всегда дает тот же результат?

4b9b3361

Ответ 1

Нет гарантии, какие две строки вы получите. Это будут первые два, извлеченные из сканирования таблицы.

Итератор TOP в плане выполнения прекратит запрашивать строки после возвращения двух.

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