Основной простой вопрос для всех вас, DBA.
Когда я делаю выбор, всегда ли гарантируется, что мой результат будет упорядочен первичным ключом, или я должен указать его с помощью "order by"?
Я использую Oracle как свою БД.
Основной простой вопрос для всех вас, DBA.
Когда я делаю выбор, всегда ли гарантируется, что мой результат будет упорядочен первичным ключом, или я должен указать его с помощью "order by"?
Я использую Oracle как свою БД.
Нет, если вы не используете "порядок", вам не гарантируется никаких заказов. На самом деле вам не гарантировано, что порядок от одного запроса к следующему будет таким же. Помните, что SQL работает с данными на основе набора. Теперь может быть реализована одна реализация базы данных или другая, чтобы обеспечить упорядочение определенным образом, но вы никогда не должны полагаться на это.
Когда я делаю выбор, всегда ли гарантируется, что мой результат будет упорядочен первичным ключом, или я должен указать его с помощью "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
Нет, заказ никогда не гарантируется, если вы не используете ORDER BY.
Порядок загрузки строк зависит от метода доступа (например, полного сканирования таблицы, сканирования индекса), физических атрибутов таблицы, логического расположения каждой строки в таблице и других факторов. Они могут измениться, даже если вы не измените свой запрос, поэтому, чтобы гарантировать последовательный заказ в вашем наборе результатов, необходим ORDER BY.
Это зависит от вашей БД, а также зависит от индексированных полей.
Например, в моей таблице Пользователи каждого пользователя имеют уникальное поле varchar (20) - логин и первичный ключ - id.
И "Выбрать * от пользователей" возвращает набор строк, упорядоченный по логину.
Если вы желаете конкретного заказа, тогда объявите его специально, используя ORDER BY.
Что делать, если в таблице нет первичного ключа?
Если вы хотите, чтобы ваши результаты были в определенном порядке, всегда указывайте порядок