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

Порядок оператора SQL Select без предложения Order By

Как я знаю, из теории реляционной базы данных следует сказать, что оператор select без предложения order by не имеет особого порядка. Но на самом деле в SQL Server и Oracle (я тестировал эти 2 платформы), если я запрашиваю из таблицы без предложения order by несколько раз, я всегда получаю результаты в том же порядке. Можно ли полагаться на это поведение? Кто-нибудь может помочь немного объяснить?

4b9b3361

Ответ 1

Нет, на это поведение нельзя положиться. Порядок определяется тем, как планировщик запросов решил создать набор результатов. простые запросы, такие как select * from foo_table, скорее всего, будут возвращены в том порядке, в котором они хранятся на диске, которые могут быть в порядке первичного ключа или порядке, в котором они были созданы, или в каком-либо другом случайном порядке. более сложные запросы, такие как select * from foo where bar < 10, могут вместо этого возвращаться в порядке очередного столбца на основе чтения индекса или порядка таблицы для сканирования таблицы. более сложные запросы, с условиями multipe where, group by, union s, будут в любом порядке, который решает планировщик, наиболее эффективно генерировать.

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


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

без предложения ORDER BY, вы не будете точно задавать определенный порядок, и поэтому RDBMS предоставит вам эти строки в некотором порядке, который (возможно) соответствует некоторому совпадающему аспекту запроса, основанному на любом алгоритме СУБД рассчитывает получить данные быстрее всех.

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

Поскольку вы действительно заботитесь о BOTH, используйте ORDER BY, а затем тщательно настройте свой запрос и базу данных, чтобы он был эффективным.

Ответ 2

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

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

Ответ 3

У Тома Ките есть домашнее животное разглядывает эту тему. По какой-то причине люди увлечены этим и продолжают пытаться выявить случаи, когда вы можете положиться на определенный порядок, не указав ORDER BY. Как заявили другие, вы не можете. Здесь еще один забавный нить по теме на сайте AskTom.

Ответ 4

Правильный ответ

Это новый ответ, добавленный для исправления старого. У меня есть ответ от Tom Kyte, и я публикую его здесь:

Если вам нужны отсортированные строки, ВЫ ДОЛЖНЫ ИСПОЛЬЗОВАТЬ ЗАКАЗ. Нет, если, и, или, кроме того, об этом. период. http://tkyte.blogspot.ru/2005/08/order-in-court.html Вам нужно заказать этот IOT. Строки сортируются в листовых блоках, но листовые блоки не сортируются. быстрое полное сканирование = несортированные строки.

https://twitter.com/oracleasktom/status/625318150590980097

https://twitter.com/oracleasktom/status/625316875338149888


Неверный ответ

( Внимание! Оригинальный ответ на вопрос был помещен ниже здесь только ради истории. Это неправильный ответ. Правильный ответ помещен выше)

Как писал Том Кит в упомянутой ранее статье:

Вы должны думать о куче организованной таблице как о большой неупорядоченной сбор строк. Эти строки появятся в кажущейся случайной порядок и в зависимости от других используемых параметров (параллельный запрос, различные режимы оптимизатора и т.д.), они могут появляться в другом с тем же запросом. Никогда не рассчитывайте на порядок строк из запрос, если у вас нет предложения ORDER BY по вашему запросу!

Но заметьте, он говорит только о куче-организованных таблицах. Но есть также индексированные таблицы. В этом случае вы можете полагаться на порядок выбора без ORDER BY, потому что порядок неявно определяется первичным ключом. Это справедливо для Oracle.

Для кластеризованных индексов SQL Server (индексированных таблиц), созданных по умолчанию. Существует также возможность выравнивания информации в магазине PostgreSQL по индексу. Более подробную информацию можно найти здесь

UPDATE: Я вижу, что на мой ответ был голос. Поэтому я попытаюсь немного объяснить свою точку зрения. В разделе "Обзор индексированных таблиц" есть фраза:

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

http://docs.oracle.com/cd/E25054_01/server.1111/e25789/indexiot.htm#CBBJEBIH

Из-за индекса все данные хранятся в определенном порядке, я считаю, что это верно для Pg. http://www.postgresql.org/docs/9.2/static/sql-cluster.html

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

Ответ 5

У меня было интервью где-то в прошлом году из Facebook или LinkedIn, я не помню, вопрос был "написать SQL для упорядочивания строк без использования предложения ORDER BY". Это был единственный вопрос, который мне задавали, и он был провален! Я терпеть не могу подобные интервью, поскольку они клеймят человека как "некомпетентного", основываясь на одном вопросе. В моем случае мой 15-летний опыт был признан бесполезным на основании этого вопроса. Нет, это не было суждением о "подходе" к проблеме, леди хотела точное решение! Том Кайт ответил мне, что мне лучше не работать на такого менеджера :) Я не могу согласиться больше!