В каком порядке извлекаются строки при отсутствии предложения 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 таблицы, производите расчет по двум из них и возвращаете только вычисленное значение.

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

jmoreno
источник