В каком порядке извлекаются строки при отсутствии предложения ORDER BY?


11

Один программист тестирует и сравнивает одно и то же приложение, которое использует ту же структуру базы данных и одни и те же данные, только в двух отдельных базах данных: одна с Oracle 8 и одна с Oracle 9.

Приложение выполняет запрос без ORDER BY предложения.

Он утверждает, что запрос ORDER-BY-less должен возвращать строки в одинаковом порядке в обеих базах данных.

Я говорю ему, что нет гарантии того же порядка строк, если вы не предоставите оговорку ORDER BY.

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

Он намекает, что две среды БД не равны, потому что они имеют разную статистику, разные движки rdbms и т. Д., Но не потому, что мне не удалось воспроизвести каждый индекс исходной базы данных.

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

Вопрос

Так что я могу объяснить его лучше:

В каком порядке запрос извлекает строки, если вы не указали в явном виде предложение ORDER BY, и почему этот запрос не возвращает строки в том же порядке?


3
Это не определено. Я не верю, что в спецификации SQL указывается конкретный порядок возврата записей, поэтому он будет зависеть от реализации.
— Роберт Харви

1
@RobertHarvey. Именно поэтому я и говорю ему. На самом деле: по определению реляционные таблицы не должны иметь определенного порядка.
— Тулаинс Кордова

1
Даже на одной и той же версии программного обеспечения может иметь смысл использовать другой индекс, поскольку он может быть более избирательным на основе статистики индекса, которую он собрал для точных данных в этой базе данных. Таким образом, вы действительно не можете рассчитывать на заказ, если не указали его.
— PSR

Вы можете реально ожидать, что первый запрос по неиндексированному столбцу будет следовать порядку «вставки времени»; по индексируемому «времени обновления». Последовательные запросы могут быть «испорчены» кэшированными результатами и поэтому довольно рандомизированы; тем не менее никогда не зависит от него - он может меняться от версии к версии, по параметрам, операциям обновления и плохой погоде в полнолуние. «Не определено» - это правильный ответ, а все остальное - в лучшем случае обоснованные догадки.
— SF.

1
Результирующие наборы, возвращаемые RDMBS-es, - это просто наборы , которые по определению не имеют определенного порядка. Таким образом, СУБД может вернуть их в любом порядке и изменить порядок снова при следующем выполнении запроса. Полагаться на определенный заказ без предложения ORDER BY было бы ошибкой. Я всегда пытаюсь объяснить это своим коллегам, но я преуспеваю только половину времени: D.
— Раду Мурзеа

Ответы:


25

Из Википедии :

Предложение ORDER BY определяет, какие столбцы используются для сортировки результирующих данных и в каком направлении они должны быть отсортированы (параметры могут быть по возрастанию или по убыванию). Без предложения ORDER BY порядок строк, возвращаемых запросом SQL, не определен.

Так что это не определено.

В спецификации SQL не указывается конкретный порядок возврата записей, поэтому он будет зависеть от реализации.

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

Поскольку порядок не указан в спецификации, неразумно полагаться на поведение реализации конкретного поставщика, поскольку он может варьироваться от одного поставщика к другому, и поставщик может изменить заказ в любое время без предупреждения.

Как вы сказали, просто включите ORDER BYпредложение, если порядок важен.


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

+1 AFAICR Порядок даже может меняться каждый раз, когда вы выполняете любой заданный запрос для конкретного экземпляра базы данных.
— MarkJ

2
Я бы сказал, что без предложения ORDER BY единственным разумным результатом является то, что создает наименьшие накладные расходы. Для простых механизмов хранения БД и запросов это часто будет порядок вставки (а для сгенерированных первичных ключей такой же, как порядок первичного ключа). Но как только у вас появятся хеш-соединения, я ожидаю, что порядок будет в основном случайным.
— Майкл Боргвардт

2

Очевидно, что указание на то, что в спецификации не указано, в каком порядке поступают данные, не сработало. Вероятно, потому что он знает, что данные находятся на диске или в памяти где-то и таким образом имеет это как заказ. Спросите его, каков порядок расчета данных из нескольких таблиц. Т.е. создайте пример, в котором вы объединяете 4 таблицы, производите расчет по двум из них и возвращаете только вычисленное значение.

Движок возвращает данные в том порядке, в котором он их находит (при отсутствии порядка), но то, как он их находит, зависит от факторов, которые могут измениться - индекса, статистики, кэша. Как правило, данные будут в согласованном порядке, но если вы зависите от заказа, вам нужно запросить его.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.