Oracle SQL возвращает строки произвольным образом, когда не используется предложение "order by" - PullRequest
8 голосов
/ 22 сентября 2010

Может быть, кто-то может объяснить мне это, но при запросе таблицы данных из Oracle, где существует несколько записей для ключа (скажем, идентификатора клиента), запись, которая появляется первой для этого клиента, может отличаться, если не существует неявного " оператор order by, обеспечивающий порядок, скажем, альтернативного поля, такого как тип транзакции. Таким образом, выполнение одного и того же запроса к одной и той же таблице может привести к другому порядку записи, чем 10 минут назад.

Например, один прогон может дать:

Cust_ID, Transaction_Type
123 А
123 B

Если не используется предложение "order by Transaction_Type", Oracle может произвольно вернуть следующий результат при следующем запуске запроса:

Cust_ID, Transaction_Type
123 B
123 A

Полагаю, у меня сложилось впечатление, что в Oracle был порядок строк в базе данных по умолчанию, который (возможно) отражал физический порядок на диске. Другими словами, произвольный порядок, который является неизменным и гарантирует тот же результат при повторном выполнении запроса.

Это имеет отношение к оптимизатору и как он решает, где наиболее эффективно извлекать данные?

Конечно, лучшая практика с точки зрения программирования - форсировать любой требуемый порядок, я был немного обеспокоен этим поведением.

Ответы [ 8 ]

22 голосов
/ 22 сентября 2010

Порядок строк, возвращаемых приложению из оператора SELECT, равен ПОЛНОСТЬЮ АРБИТРАРИЙ , если не указано иное.Если вы хотите, нуждаетесь или ожидаете, что строки будут возвращаться в определенном порядке, ответственность за указание такого порядка лежит на пользователе.

(Предупреждение: некоторые версии Oracle неявно сортируют данные в порядке возрастания, если определенные операциибыли использованы, например, DISTINCT, UNION, MINUS, INTERSECT или GROUP BY. Однако, поскольку в Oracle реализована сортировка хэшей, характер сортировки данных может различаться, и многие функции SQL, полагающиеся на эту функцию, не работают.)

8 голосов
/ 22 сентября 2010

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

Обратите внимание, что это также верно даже для ORDER BY для равных значений.Например:

Col1 Col2
1    1
2    1
3    2
4    2

Если вы используете ORDER BY Col2, вы все еще не знаете, будут ли строки 1 или 2 первыми.

6 голосов
/ 22 сентября 2010

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

Если порядок, в котором возвращаются строки, имеет значение, вы должны использовать предложение ORDER BY. Иногда вам может повезти, и строки вернутся в том порядке, в котором вы хотите, чтобы они были, даже без ORDER BY, но нет гарантии, что A) вам повезет с другими запросами, и B) порядок, в котором строки возвращаются завтра будет таким же, как заказ, в котором они были возвращены сегодня.

Кроме того, обновления продукта базы данных могут изменить поведение запросов. Пришлось немного скремблировать при обновлении основной версии в прошлом году, когда мы обнаружили, что Oracle 10 возвращал результаты GROUP BY в порядке, отличном от Oracle 9. Причина - нет предложения ORDER BY.

ORDER BY - когда порядок возвращаемых данных действительно имеет значение.

6 голосов
/ 22 сентября 2010

Просто изобразите строки в таблице, как шарики в корзине. У шариков есть заказ?

Я не думаю, что есть какая-либо СУБД, которая гарантирует порядок, если не указан ORDER BY.

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

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

5 голосов
/ 22 сентября 2010

Простой ответ заключается в том, что стандарт SQL говорит, что для запросов, не имеющих оператора ORDER BY, не существует порядка по умолчанию, поэтому вы никогда не должны принимать его.

Реальная причина, вероятно, связана схэши, назначенные каждой строке, когда она помещается в набор записей.Нет оснований предполагать последовательное хеширование.

2 голосов
/ 23 сентября 2010

, если вы не используете ORDER BY, заказ будет произвольный ;однако, зависит от физических аспектов хранения и памяти.поэтому, если вы будете повторять один и тот же запрос сотни раз за 10 минут, вы будете получать почти одинаковый заказ каждый раз, потому что, вероятно, ничего не изменится.

Вещи, которые могут изменить «порядок следования»:1006 *

план выполнения - если изменяется (вы указали, что) вставляет и удаляет таблицы, участвующие в запросе. другие вещи, такие как наличие в памяти строк. (другие запросы в других таблицах могут повлиять на это)
0 голосов
/ 24 декабря 2014

Поскольку я новичок в ядре базы данных Oracle, я заметил такое поведение в моих SELECT заявлениях, в которых нет ORDER BY.

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

Таким образом, когда вы выполняете выборку таблицы без заказа в SQL Server, он всегда извлекает данные, упорядоченные по значению первичного ключа.

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

Я пришел к выводу, что во ВСЕХ моихЗапросы Oracle, которые я должен использовать ORDER BY, или я получу непредсказуемый порядок, который сильно повлияет на мои отчеты конечных пользователей.

0 голосов
/ 31 мая 2013

Когда вы попадаете в параллельный ввод-вывод данных, разве невозможно получить разные последовательности при разных запусках, даже без изменения хранимых данных?

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

...