SQL Server упорядочивает произвольные результаты последовательно? - PullRequest
0 голосов
/ 14 марта 2019

Предположим, у меня есть таблица с 2 столбцами и 3 строками:

A|B
1|1
1|2
1|3

И я пишу

SELECT TOP 1 B FROM MyTable ORDER BY A

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

Я спрашиваю, потому что я хочу угадать прошлое поведение некрасивого унаследованного кода.

1 Ответ

0 голосов
/ 15 марта 2019

Порядок в этом случае не гарантируется.

Вы будете стремиться к , чтобы получить те же результаты, но есть несколько вещей, которые могут изменить его.Я могу вспомнить четыре примера, но есть и другие:

  1. Если вы измените индексирование на таблице
  2. В Enterprise Edition, AdvancedСканирование может выполнить прокрутку по таблице или сканирование индекса уже выполняется для другого запроса, где внезапно «верхний» результат отличается.
  3. Если таблица достаточно велика для нескольких страниц и одного дняу вас в памяти уже есть страница, отличная от предыдущей.
  4. Если таблица хранится в порядке (A, B), но у вас есть индекс в (A, B DESC), вы можете получитьразные результаты в зависимости от того, загружена ли таблица или индекс в память.

Обратите внимание, что некоторые из них могут привести к внезапному изменению результатов, если из-за нехватки памяти Sql Server выгрузит соответствующую страницу.

Как более общий случай, не думайте только с точки зрения одного запроса к таблице, но также и множества разных запросов к одним и тем же неупорядоченным данным.Например, если вы присоединяетесь к этой таблице на основе критериев из другой таблицы, которая соответствует индексу, Sql Server может вернуть первый найденный результат, который совпадает, и для объединения может быть строка, отличная от строки запросапросто потому, что соединение хорошо совпадает с другим индексом.

Короче говоря, если это имеет значение, будьте более строгими с предложением ORDER BY.

...