Lorsque je fais une sélection, est-il toujours garanti que mon résultat sera ordonné par la clé primaire, ou devrais-je le spécifier avec une 'commande par'?
Non, ce n'est pas garanti.
SELECT *
FROM table
très probablement utilisera TABLE SCAN
qui n'utilise pas la clé primaire du tout.
Vous pouvez utiliser un indice:
SELECT /*+ INDEX(pk_index_name) */
*
FROM table
, mais même dans ce cas, la commande n'est pas garanti: si vous utilisez Enterprise Edition
, la requête peut être parallélisé.
Ceci est un problème, car ORDER BY
ne peut pas être utilisé dans une sous-requête de clause SELECT
et vous ne pouvez pas écrire quelque chose comme ceci:
SELECT (
SELECT column
FROM table
WHERE rownum = 1
ORDER BY
other_column
)
FROM other_table
Y a-t-il une chance que les enregistrements soient retournés dans l'ordre de l'index clusterisé? –
Une très bonne chance, mais pas garantie. Les requêtes compliquées impliquant des jointures, des vues, des sous-requêtes et similaires peuvent laisser l'ensemble de résultats ordonné très différemment. –
ET il peut parfois revenir dans l'ordre de l'index cluster et parfois non. Toujours utiliser une commande par si vous voulez une commande spécifique. – HLGEM