2010-04-23 9 views
9

Es una pregunta caprichosa, siempre es algo que me he preguntado y me gustaría saber por qué hace lo que hace, puede profundizar un poco mi comprensión.¿Cómo deciden los servidores de bases de datos qué orden devolver las filas sin ninguna instrucción "ordenar por"?

Digamos que hago "SELECT TOP 10 * FROM TableName". En plazos cortos, vuelven las mismas 10 filas, por lo que no parece aleatorio. Ellos no fueron los primeros ni los últimos creados. En mi tamaño de muestra masiva de ... una tabla, no devuelve el valor de la clave primaria de incremento automático mínimo o máximo.

También me imagino que el problema se vuelve más complejo cuando se toman en cuenta las uniones.

Mi base de datos de elección es MSSQL, pero creo que esta podría ser una pregunta interesante, independientemente de la plataforma.

Respuesta

12

Si no proporciona una cláusula ORDER BY en una instrucción SELECT obtendrá filas en orden arbitrario.

El pedido real no está definido y depende de qué bloques/registros ya están almacenados en memoria caché, en qué orden se realiza la E/S, cuándo están programados para ejecutarse los hilos en el servidor de base de datos, etc.

No hay sentido ni razón para el pedido y nunca debe basar ninguna expectativa en qué orden estarán las filas a menos que proporcione un ORDER BY.

+0

Sí un millón de veces ¡sí! – HLGEM

+0

Debo estar loco, entonces. Noté en PostrgeSQL que si no proporciono un pedido, los obtengo por "último toque", de forma consistente. – seanmonstar

+0

En MySQL MyISAM puede "predeterminar" el orden haciendo 'ALTER TABLE tblName ORDER BY whatever' –

6

Si no están ordenadas por la consulta de llamada, creo que simplemente se devuelven en el orden en que se leyeron en el disco. Esto puede variar debido a los tipos de combinaciones utilizadas o los índices que buscaron los valores.

Puede ver esto si la tabla tiene un índice agrupado (y solo está seleccionando - un JOIN puede reordenar cosas) - un SELECT devolverá las filas en orden de índice agrupado, incluso sin un Cláusula ORDER BY.

+3

+1 Así es como funciona en la práctica, pero no cuente con que sean devueltos en ese orden, es realmente indefinido. Si hay un cambio en el DB (nueva versión, fixpack o lo que sea) podría ser teóricamente diferente. –

+1

Romain tiene razón, aunque siempre han regresado en ese orden para mí, no se puede confiar. Si los necesita en un orden determinado, una ORDEN POR ES es la única manera de garantizarlo. – SqlRyan

1

’¿Cómo servidores de bases de decidir qué orden para volver filas sin ningún tipo de" orden por

Ellos simplemente no toman ninguna "decisión" con respecto a los pedidos. Ven que al usuario no le importa ordenar, y tampoco les importa. Y así simplemente salen a buscar las filas solicitadas. El orden en que los encuentran es normalmente el orden en que los obtienen. Ese orden depende de cosas impredecibles para el usuario como las rutas de acceso físico elegidas, el ordenamiento de registros físicos dentro de los archivos físicos de la base de datos, etc.

No se deje engañar por el orden en que lo obtiene, en el caso donde no especificó explícitamente un orden en su consulta. Si no especifica un orden en su consulta, no se garantiza el orden en el conjunto de resultados, incluso si en la práctica los resultados parecen sugerir que el servidor parece cumplir con algún pedido.

Cuestiones relacionadas