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 шага.
Как вы можете видеть, нет поиска индекса, это просто чистое сканирование таблицы и
Top
показывает фактическое количество строк, равное 2, а также Table Scan
; Это не так (там много строк).
Но когда я запускаю что-то вроде
SELECT TOP (2) *
FROM
MstConfigSettings
ORDER BY
DefaultItemId
В плане выполнения отображается
и
Итак, когда я не применяю ORDER BY
, шаги разные (нет никакого вида). Но вопрос в том, как работает этот Top
, когда нет Sort
и почему и как он всегда дает тот же результат?