Всегда ли выбирает "Выбрать" по первичному ключу?
Основной простой вопрос для всех вас, 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
Если вы хотите, чтобы ваши результаты были в определенном порядке, всегда указывайте порядок