Всегда ли выбирает "Выбрать" по первичному ключу?

Основной простой вопрос для всех вас, DBA.

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

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

Ответы

Ответ 1

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

Ответ 2

Когда я делаю выбор, всегда ли гарантируется, что мой результат будет упорядочен первичным ключом, или я должен указать его с помощью "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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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