Всегда ли «Выбрать» заказывать по первичному ключу? - PullRequest
16 голосов
/ 05 мая 2009

Простой простой вопрос для всех вас, администратор баз данных.

Когда я делаю выбор, всегда ли гарантируется, что мой результат будет упорядочен по первичному ключу, или я должен указать его с помощью 'order by'?

Я использую Oracle в качестве своей БД.

Ответы [ 6 ]

44 голосов
/ 05 мая 2009

Нет, если вы не используете «заказ по», вам не гарантируется какой-либо заказ. На самом деле вам не гарантируется, что порядок от одного запроса к следующему будет одинаковым. Помните, что SQL имеет дело с данными на основе набора. Теперь может случиться, что одна или другая реализация базы данных определенным образом предоставит заказы, но вам никогда не следует полагаться на это.

6 голосов
/ 05 мая 2009

Когда я делаю выбор, всегда гарантируется, что мой результат будет упорядочен по первичному ключу, или я должен указать его с помощью 'order by'?

Нет, это далеко не гарантировано.

SELECT  *
FROM    table

скорее всего будет использовать TABLE SCAN, который вообще не использует первичный ключ.

Вы можете использовать подсказку:

SELECT  /*+ INDEX(pk_index_name) */
        *
FROM    table

, но даже в этом случае порядок не гарантируется: если вы используете Enterprise Edition, запрос может быть распараллелен.

Это проблема, поскольку ORDER BY нельзя использовать в подзапросе предложения SELECT, и вы не можете написать что-то вроде этого:

SELECT  (
        SELECT  column
        FROM    table
        WHERE   rownum = 1
        ORDER BY
                other_column
        )
FROM    other_table
2 голосов
/ 05 мая 2009

Нет, заказ не гарантируется, если вы не используете ORDER BY.

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

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

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

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

Если вы хотите конкретный заказ, то объявите его, используя ORDER BY.

Что если таблица не имеет первичного ключа?

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

Это зависит от вашей БД, а также от индексированных полей.

Например, в моей таблице Users каждый пользователь имеет уникальное поле varchar (20) - логин, а первичный ключ - id.

И «Выбрать * из пользователей» возвращает набор строк, упорядоченный по имени входа.

...