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