Порядок сортировки результатов по выбору «БЕЗ ГДЕ» или «ORDER BY» - PullRequest
5 голосов
/ 23 декабря 2011

У меня есть таблица с кластеризованным индексом PK, а также другие индексы, как уникальные, так и неуникальные.Если я введу (точно):

SELECT * FROM table_name

или

SELECT col1, col2 FROM table_name

, в каком порядке будут возвращены строки?

Это первый вопрос в вопроснике для интервьюклиент отправил нам.Вот инструкции:

Если ответ на этот вопрос неправильный, немедленно прекратите собеседование!Человек, независимо от заявленных способностей, не понимает системы управления реляционными базами данных на основе SQL.Это логика SQL-101 за последние 25 с лишним лет.Правильный ответ: «неизвестно / случайно / не определено, поскольку в качестве части запроса не было указано предложение ORDER BY».

Я почему-то не уверен, что это действительно правильно.Все комментарии приветствуются.

Спасибо,

Радж

Ответы [ 2 ]

8 голосов
/ 23 декабря 2011

Даже если таблица имеет первичный ключ / кластерный индекс, вы не можете быть уверены в порядке строк. Хотя в плане выполнения в конце будет выполняться сканирование индекса / кучи, если запрос выполняется параллельно на многих ядрах, результирующий набор данных не будет отсортирован из-за шага плана слияния параллельных потоков.

Вероятно, вы не увидите его в небольших базах данных, но попробуйте создать один из множества файлов на разных жестких дисках и выполнить простой запрос на многоядерной машине. Скорее всего, вы получите результаты, «частично отсортированные» по идентификатору - то есть будут блоки, в которых отсортированы строки, но блоки будут получены в полуслучайном порядке.

5 голосов
/ 23 декабря 2011

Инструкции обращаются к SQL на концептуальном уровне, на котором результатом запроса являются отношения, а отношения неупорядочены.При переходе от концептуального к реальному причина, по которой в стандарте SQL не определено неявное упорядочение, заключается в том, что СУБД могут свободно возвращать любой порядок, наиболее эффективный для их реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...