Mejores prácticas de SQL para lidiar con el orden de clasificación predeterminado

Resuelto Yada asked hace 15 años • 10 respuestas

He leído una gran cantidad de código SQL, parece que el desarrollador asume que el orden de clasificación predeterminado siempre se cumple. Por ejemplo, al crear una lista de selección HTML, simplemente lo harían SELECT id, name FROM tablesin emitir una ORDER BYcláusula.

Desde mi propia experiencia, parece que dbms siempre ordena datos usando FIFO si no ORDER BYse proporciona ninguna cláusula ni índice. Sin embargo, el orden no está garantizado. Pero nunca he visto un dbms reordenando datos si no hay cambios en la tabla.

¿Alguna vez ha experimentado un dbms seleccionando datos en un orden no determinista si no hay cambios en la tabla?

¿Es una buena práctica poner siempre una cláusula ORDER BY?

Yada avatar Nov 25 '09 04:11 Yada
Aceptado

No existe un orden de clasificación predeterminado. Incluso si la tabla tiene un índice agrupado, no se garantiza que obtendrá los resultados en ese orden. Debe utilizar una cláusula de orden por si desea un orden específico.

HLGEM avatar Nov 24 '2009 21:11 HLGEM

Como mencionan los otros carteles, si no especifica un orden de clasificación, el estándar SQL dice que los resultados pueden estar en el orden que el procesador de consultas considere más conveniente y eficiente.

Digamos que realiza un SELECT simple y desordenado para todas las filas de una tabla CLIENTE, que no tiene índices ni clave principal. Es muy posible, e incluso probable, que el procesador de consultas realice un escaneo directo de la tabla y produzca las filas en el orden en que se insertaron originalmente (dándole el comportamiento FIFO que vio).

Si luego agrega un índice en los campos ESTADO y CIUDAD (en ese orden) y luego realiza una consulta, WHERE STATE = 'NY'el procesador de consultas puede decidir que es más eficiente escanear las entradas del índice para ESTADO = 'NY' en lugar de realizar un escaneo completo de la tabla. En este caso probablemente materializaría las filas en orden ESTADO, CIUDAD.

Ni siquiera esto es seguro. Por ejemplo, si el procesador de consultas ha recopilado estadísticas que muestran que casi todos los valores de ESTADO en su tabla son 'NY' (tal vez porque la base de datos es para una empresa de alquiler de equipos con sede en Albany), puede decidir que el escaneo de la tabla es en realidad más barato. que el escaneo de índice, y verá FIFO nuevamente.

Es una buena idea aprender algunos conceptos básicos sobre cómo su base de datos planifica sus consultas. Puede usar la EXPLAINdeclaración para ver cómo su DBMS ejecutaría cualquier consulta determinada y luego usarla para optimizar su consulta, en algunos casos por órdenes de magnitud. Esta es un área fascinante y útil para aprender.

Jim Ferrans avatar Nov 24 '2009 22:11 Jim Ferrans