Как серверы баз данных решают, в каком порядке возвращать строки без каких-либо операторов "order by"? - PullRequest
9 голосов
/ 23 апреля 2010

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

Допустим, я выбрал "ВЫБЕРИТЕ ТОП 10 * ИЗ TableName". На коротких таймфреймах возвращаются те же 10 строк, поэтому это не кажется случайным. Они не были первыми или последними созданными. В моем огромном размере выборки ... в одной таблице он не возвращает минимального или максимального значения первичного ключа с автоинкрементом.

Я также считаю, что проблема становится более сложной, если принять во внимание объединения.

Моя база данных - MSSQL, но я полагаю, что это может быть интересным вопросом независимо от платформы.

Ответы [ 4 ]

12 голосов
/ 23 апреля 2010

Если вы не предоставите предложение ORDER BY в операторе SELECT, вы получите строки в произвольном порядке.

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

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

6 голосов
/ 23 апреля 2010

Если они не упорядочены по вызывающему запросу, я считаю, что они просто возвращаются в том порядке, в котором они были прочитаны с диска. Это может варьироваться из-за типов используемых объединений или индексов, которые искали значения.

Это можно увидеть, если в таблице есть кластеризованный индекс (а вы просто выбираете - JOIN может изменить порядок вещей) - SELECT вернет строки в порядке кластеризованного индекса, даже без ORDER. BY BY.

3 голосов
/ 23 апреля 2010

Здесь есть очень подробное объяснение с примерами: http://sqlserverpedia.com/blog/sql-server-bloggers/its-the-natural-order-of-things-not/

1 голос
/ 24 апреля 2010

"Как серверы баз данных решают, в каком порядке возвращать строки без каких-либо операторов" order by "?"

Они просто не принимают никакого «решения» в отношении заказа. Они видят, что пользователь не заботится о заказе, и поэтому они тоже не заботятся. И поэтому они просто выходят, чтобы найти запрошенные строки. Порядок, в котором они их находят, обычно соответствует порядку их получения. Этот порядок зависит от непредсказуемых для пользователя вещей, таких как выбранные физические пути доступа, порядок физических записей внутри физических файлов базы данных и т. Д. И т. Д.

Не позволяйте себе вводить в заблуждение порядок, когда вы его получаете, в случае, если вы явно не указали порядок в своем запросе. Если вы не укажете порядок в запросе, порядок в наборе результатов не будет гарантирован, даже если на практике результаты, по-видимому, предполагают, что какой-либо порядок, по-видимому, соблюдается сервером.

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