Cuando hago una selección, ¿siempre se garantiza que mi resultado será ordenado por la clave principal, o debería especificarlo con un 'orden por'?
No, no está garantizado.
SELECT *
FROM table
muy probablemente utilizará TABLE SCAN
que no utiliza la clave principal en absoluto.
Se puede utilizar una pista:
SELECT /*+ INDEX(pk_index_name) */
*
FROM table
, pero incluso en este caso el pedido no está garantizada: si utiliza Enterprise Edition
, la consulta puede ser parallelized.
Este es un problema, ya que ORDER BY
no se pueden utilizar en una cláusula de subconsulta SELECT
y no se puede escribir algo como esto:
SELECT (
SELECT column
FROM table
WHERE rownum = 1
ORDER BY
other_column
)
FROM other_table
¿Hay alguna posibilidad de que los registros se devuelvan en el orden del índice agrupado? –
Una muy buena oportunidad, pero no garantizada. Consultas complicadas que involucran uniones, vistas, sub consultas y similares pueden dejar el conjunto de resultados ordenado de manera muy diferente. –
Y puede devolver a veces en el orden de índice agrupado y, a veces no. Siempre use una orden por si desea una orden específica. – HLGEM