¿DB2 ordena los datos por la clave primaria?


8

Recientemente tuve una discusión con un colega que estaba presionando para eliminar el orden por cláusulas de una consulta de producción porque el orden por columna era el mismo que la clave principal .

Después de una larga discusión en la que traté de explicar que no puede garantizar un pedido basado en la clave principal, la conclusión final fue que no iba a presionar para que se modificaran las consultas MSSQL.
Pero todavía iba a cambiar las consultas de DB2.

No pude encontrar de inmediato un artículo que refutara que DB2 ordena consultas por la clave primaria, y actualmente me pregunto si lo hace o no.

Entonces mi pregunta es, ¿cómo ordena DB2 una consulta si no hay orden por cláusula? ¿Utiliza la clave primaria?
¿Cómo puede garantizar que los datos salgan ordenados correctamente, sin una orden por cláusula, en un sistema paralelo?

Respuestas:


18

No, tu colega está equivocado.

Todos los productos de SQL (DBMS que se comportan de acuerdo con los estándares de SQL) no garantizan que el resultado de una consulta se ordenará de ninguna manera, a menos que haya una ORDER BYcláusula en la consulta .

Como mencionan los documentos de IBM DB2 :

El pedido se realiza de acuerdo con las reglas de comparación descritas en los elementos del lenguaje. El valor nulo es más alto que todos los demás valores. Si su especificación de pedido no determina un pedido completo, las filas con valores duplicados de la última clave de clasificación identificada tienen un orden arbitrario. Si no especifica ORDER BY, las filas de la tabla de resultados tienen un orden arbitrario.


"Si se comportan según los estándares SQL" es un gran si ... IBM documenta FTW.
WernerCD

@WernerCD No DBMS cumple al 100% con el estándar (y hay muchas versiones del mismo). Pero afirman cumplir con muchas partes. Espero al menos tener donde difieren, documentado.
ypercubeᵀᴹ

Sí, por eso obtuve +1 en documentos de IBM sobre "Estándares". "Esperado" vs "Actual" puede, y definitivamente lo hará, morderlo en el frasco.
WernerCD

11

Como se señaló en la respuesta de ypercube, cuando no hay ORDER BYcláusula no hay un orden definido .

Lo que me gustaría agregar es que es importante darse cuenta de que SQL es en gran medida una abstracción, no especifica paso a paso lo que debe hacer el DBMS, sino que especifica sus requisitos del resultado final.

Esto implica que si los datos ya se buscan de una manera que asegure el orden correcto, esto es así porque el DBMS decidió una estrategia de este tipo y ya sabrá que no es necesario un trabajo de clasificación adicional para cumplir con los requisitos de la ORDER BYcláusula .

Por otro lado, si no especifica que el pedido es significativo para usted (¿aunque realmente lo sea?), El DBMS lo tendrá en cuenta y si encuentra una estrategia diferente que sea más eficiente para encontrar los datos correctos en alguna otra orden aprovechará el hecho de que aparentemente no le importó la orden. (La estrategia elegida también podría cambiar con el tiempo, en función de la cantidad creciente de datos en las tablas relevantes, parches de software, etc.)

Es decir, eliminar la ORDER BYcláusula tiene muy pocas ventajas (un tamaño de consulta un poco más pequeño) pero una desventaja potencialmente enorme si el orden es realmente importante. Especialmente, ya que esto podría funcionar con el conjunto de datos de prueba y pasar las pruebas de aceptación solo para causar serios problemas en el futuro.


1
La razón que dio en su hoja de implementación es que "Ordenar por es tomar recursos de la CPU, mientras que la clave principal ya implica el orden". Lo que me sonó muy mal (como lo prueban las respuestas hasta ahora)
Reaces

@Reaces ¿DB2 utiliza tablas de 'montón' de forma predeterminada o se parece más a SQL Server con índices agrupados? No cambia la respuesta, pero puede hacer que sea más fácil probar :)
Jack dice que intente topanswers.xyz

@Jack Douglas, el agrupamiento en SQL Server y DB2 son conceptos diferentes. Aprendí mucho sobre la agrupación en clúster en el servidor SQL en este hilo: groups.google.com/d/msg/comp.databases.ms-sqlserver/P7Wcs4NcF4s/… . Si está familiarizado con el servidor SQL pero no con DB2, es posible que desee echar un vistazo.
Lennart

Las tablas de @Reaces en DB2 generalmente están "agrupadas" en la clave primaria de forma predeterminada, a menos que se especifique un índice de agrupación.
Chris Aldrich

1
@ChrisAldrich: esta declaración solo es cierta para DB2 en z / OS.
mustaccio
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.