Один программист тестирует и сравнивает одно и то же приложение, которое использует ту же структуру базы данных и одни и те же данные, только в двух отдельных базах данных: одна с Oracle 8 и одна с Oracle 9.
Приложение выполняет запрос без ORDER BY
предложения.
Он утверждает, что запрос ORDER-BY-less должен возвращать строки в одинаковом порядке в обеих базах данных.
Я говорю ему, что нет гарантии того же порядка строк, если вы не предоставите оговорку ORDER BY.
База данных имеет такие же индексы и ключи. Но план объяснения показывает, что в одной из баз данных механизм использует ключ одной из соединенных таблиц, тогда как в другой базе данных он использует ключ другой.
Он намекает, что две среды БД не равны, потому что они имеют разную статистику, разные движки rdbms и т. Д., Но не потому, что мне не удалось воспроизвести каждый индекс исходной базы данных.
Я говорю ему, что он должен четко изложить ORDER BY
оговорку, если порядок действительно так важен.
Вопрос
Так что я могу объяснить его лучше:
В каком порядке запрос извлекает строки, если вы не указали в явном виде предложение ORDER BY, и почему этот запрос не возвращает строки в том же порядке?
Ответы:
Из Википедии :
Так что это не определено.
В спецификации SQL не указывается конкретный порядок возврата записей, поэтому он будет зависеть от реализации.
Без индексов в таблице разумным порядком будет порядок, в котором записи были вставлены. С определенным Первичным ключом разумный порядок будет порядком Первичного ключа. Но поскольку спецификация ANSI не требует определенного заказа, это зависит от поставщика, и их чувствительность может отличаться от вашей или моей.
Поскольку порядок не указан в спецификации, неразумно полагаться на поведение реализации конкретного поставщика, поскольку он может варьироваться от одного поставщика к другому, и поставщик может изменить заказ в любое время без предупреждения.
Как вы сказали, просто включите
ORDER BY
предложение, если порядок важен.источник
Очевидно, что указание на то, что в спецификации не указано, в каком порядке поступают данные, не сработало. Вероятно, потому что он знает, что данные находятся на диске или в памяти где-то и таким образом имеет это как заказ. Спросите его, каков порядок расчета данных из нескольких таблиц. Т.е. создайте пример, в котором вы объединяете 4 таблицы, производите расчет по двум из них и возвращаете только вычисленное значение.
Движок возвращает данные в том порядке, в котором он их находит (при отсутствии порядка), но то, как он их находит, зависит от факторов, которые могут измениться - индекса, статистики, кэша. Как правило, данные будут в согласованном порядке, но если вы зависите от заказа, вам нужно запросить его.
источник