Порядок строк по умолчанию для запроса на выборку в Oracle - PullRequest
41 голосов
/ 22 мая 2009

В Oracle, каков порядок расположения строк по умолчанию для запроса на выборку по умолчанию, если не указано предложение «order by».

Это

  1. порядок, в котором были вставлены строки
  2. нет порядка по умолчанию вообще
  3. ничего из вышеперечисленного.

Ответы [ 8 ]

41 голосов
/ 23 мая 2009

По словам Тома Кайта: «Если и до тех пор, пока вы не добавите« order by »к запросу, вы не можете НИЧЕГО сказать о порядке возвращаемых строк. Ну, если не считать», вы не можете полагаться на порядок возвращаемых строк . "

См. этот вопрос на сайте asktom.com.

Что касается ROWNUM, он физически не существует, поэтому его нельзя "освободить". ROWNUM назначается после извлечения записи из таблицы, поэтому «WHERE ROWNUM = 5» всегда не сможет выбрать какие-либо записи.

@ ammoQ: вы можете прочитать эту статью AskTom о заказе GROUP BY. Короче говоря:

Имеет ли условие Group By в гарантии Query, что выходные данные будут отсортировано по столбцам в группе заказ, даже если нет заказа статья?

и мы сказали ...

АБСОЛЮТНО НЕ,

Такого никогда не было, никогда не было, никогда будет.

21 голосов
/ 22 мая 2009

Нет явного порядка по умолчанию. По понятным причинам, если вы создаете новую таблицу, вставляете несколько строк и делаете «select *» без предложения «where», он (очень вероятно) вернет строки в порядке их вставки.

Но вы никогда не должны полагаться на порядок по умолчанию. Если вам нужен конкретный заказ, используйте предложение "order by". Например, в версиях Oracle до 9i выполнение «group by» также приводило к сортировке строк по выражению группы. В 10g такого поведения больше не существует! Обновление установок Oracle вызвало у меня некоторую работу из-за этого.

4 голосов
/ 23 мая 2009

Уже говорилось, что Oracle может выдавать вам строки в любом порядке, в котором они хотят, если вы не укажете предложение ORDER BY. Указывать порядок будет, если вы не укажете предложение ORDER BY, бессмысленно. И полагаться на это в своем коде - это «шаг, ограничивающий карьеру».

Простой пример:

SQL> create table t as select level id from dual connect by level <= 10
  2  /

Tabel is aangemaakt.

SQL> select id from t
  2  /

        ID
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rijen zijn geselecteerd.

SQL> delete t where id = 6
  2  /

1 rij is verwijderd.

SQL> insert into t values (6)
  2  /

1 rij is aangemaakt.

SQL> select id from t
  2  /

        ID
----------
         1
         2
         3
         4
         5
         7
         8
         9
        10
         6

10 rijen zijn geselecteerd.

И это только после простого удаления + вставки. И есть множество других возможных ситуаций. Параллельное выполнение, разбиение, индексирование организованных таблиц, и это лишь некоторые из них.

Итог, как уже хорошо сказал ammoQ: если вам нужно отсортировать строки, используйте предложение ORDER BY.

3 голосов
/ 26 марта 2013

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

Параллельное выполнение, упомянутое Робом ван Вейком, вероятно, объясняет это. См. Также Oracle Использование параллельного выполнения Документ.

0 голосов
/ 29 ноября 2017

Вы можете изменить порядок, в котором данные хранятся в таблице, с помощью INSERT с помощью предложения ORGANIZATION оператора CREATE TABLE

0 голосов
/ 05 ноября 2016

На это влияет индекс, если есть индекс, он вернет восходящий порядок, если индекса нет, он вернет вставленный заказ.

0 голосов
/ 22 мая 2009

Хотя, это должно быть rownnum (ваш # 2), это действительно не гарантировано, и вы не должны доверять ему на 100%.

0 голосов
/ 22 мая 2009

Я полагаю, что он использует скрытый атрибут Oracle Rownum.

Так что ваш # 1, вероятно, прав, если не было выполнено ни одного удаления, которое могло бы освободить rownums для дальнейшего использования.

РЕДАКТИРОВАТЬ: Как уже говорили другие, вы действительно не должны полагаться на это, никогда. Кроме того, удаляется множество различных условий, которые могут повлиять на поведение сортировки по умолчанию.

...