У якому порядку вилучаються рядки, відсутні пункти ORDER BY?


11

Один програміст тестує та порівнює той самий додаток, який використовує ту саму структуру бази даних та ті самі дані, лише у двох окремих базах даних, одна з Oracle 8 та одна з Oracle 9.

Додаток виконує запит без ORDER BY застережень.

Він стверджує, що запит "ЗАМОВЛЕННЯ" повинен повертати рядки в однаковому порядку в обох базах даних.

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

База даних має однакові індекси та ключі. Але план пояснення показує, що в одній із баз даних двигун використовує ключ однієї з об'єднаних таблиць, тоді як в іншій базі даних використовується інша.

Він наполягає на тому, що два оточення БД не рівні, тому що вони мають різну статистику, різні двигуни rdbms тощо, але не тому, що мені не вдалося скопіювати кожен індекс, який має оригінальна база даних.

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

Питання

Тож я можу пояснити йому краще:

У якому порядку запит отримує рядки запиту, коли ви не чітко надаєте пункт ORDER BY, і чому цей запит не повертає рядки в тому ж порядку?


3
Це не визначено. Я не вірю, що специфікація SQL визначає конкретний порядок повернення записів, тому це залежить від реалізації.
Роберт Харві

1
@RobertHarvey Саме тому я йому кажу. Насправді: за визначенням реляційні таблиці не повинні мати конкретного порядку.
Tulains Córdova

1
Навіть у цій самій версії програмного забезпечення може бути доцільним використовувати інший індекс, тому що він може бути більш вибірковим на основі статистичних даних індексу, зібраних для точних даних у цій базі даних. Таким чином, ви дійсно не можете розраховувати на замовлення, якщо ви не вказали його.
psr

Ви можете реально очікувати, що перший запит за допомогою невкладеного стовпця слідкує за порядком "вставити час"; за індексованим "часом оновлення". Послідовні запити, ймовірно, можуть бути "заплямовані" кешованими результатами і так досить рандомізовані; проте ніколи від цього не залежать - це може змінюватися від версії до версії, за параметрами, операціями оновлення та поганою погодою в повний місяць. "Невизначений" - це правильна відповідь, а все інше - у кращому випадку поінформовані здогадки.
СФ.

1
Набори результатів, повернені RDMBS-іми, якраз такі: набори , які за визначенням не мають конкретного порядку. Тож RDBMS може повернути їх у будь-якому уподобаному порядку та знову змінити порядок при наступному виконанні запиту. Покладатися на певне замовлення без пункту ORDER BY було б помилкою. Я завжди намагаюся пояснити це своїм колегам, але я лише половину часу успішний: D.
Раду Мурзеа

Відповіді:


25

З Вікіпедії :

Пункт ORDER BY визначає, які стовпці використовуються для сортування отриманих даних та в якому напрямку їх слід сортувати (параметри зростають чи спадають). Без пункту ORDER BY порядок рядків, повернутих за допомогою SQL-запиту, не визначений.

Так це не визначено.

У специфікації SQL не вказано конкретний порядок повернення записів, тому це залежить від реалізації.

Якщо в таблиці немає індексів, розумним порядком буде порядок, в який були вставлені записи. Якщо визначено первинний ключ, розсудливим порядком буде порядок первинного ключа. Але оскільки специфікація ANSI не вимагає конкретного замовлення, це залежить від постачальника, і їх чутливість може відрізнятися від вашої чи моєї.

Оскільки замовлення не зазначено в специфікації, нерозумно покладатися на поведінку конкретного постачальника, оскільки воно може змінюватись від одного постачальника до іншого, і постачальник може змінювати замовлення в будь-який час, коли хоче, без попередження.

Як ви вже говорили, просто додайте ORDER BYпункт, якщо важливий порядок.


У запиті є кілька з’єднаних таблиць. Так один двигун БД сортує набір результатів за одним критерієм, а інший БД використовує інші критерії. Obvioulsy, якщо надано пункт ORDER BY, обидва запити повертають рядки у вказаному порядку.
Тулен Кордова

+1 AFAICR, замовлення навіть може змінюватися щоразу, коли ви виконуєте будь-який заданий запит на конкретному екземплярі бази даних.
MarkJ

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

2

Очевидно вказуючи, що специфікація не говорить про те, в якому порядку надходять дані, не працювала. Можливо, тому, що він знає, що дані знаходяться на диску чи в пам'яті десь, і, таким чином, має це як наказ. Запитайте його, який порядок обчислених даних із кількох таблиць. Тобто створити приклад, коли ви приєднуєтесь до 4 таблиць, роблячи обчислення на 2 з них і повертаючи просто обчислене значення.

Двигун повертає дані в тому порядку, який він знаходить (відсутнє замовлення), але те, як він знаходить це, залежить від факторів, які можуть змінюватися - індексу, статистики, кешу. Як правило, дані будуть у послідовному порядку, але якщо ви залежати від замовлення, вам потрібно запитати його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.