« Oracle10gr2 : Introducción a Transparent Data Encryption (TDE)Virtual Iron : La nueva adquisición de Oracle para potenciar sus máquinas virtuales »

Tips de migración desde Oracle8i a Oracle10g : ¿Por qué no ordena? (Tips migrating Sort)

Cuando se lleva adelante una migración de 9i a 10g, o de 8i a 10g, se tienen en consideración muchísimas cosas :
- Uso de manejo automático de memoria
- Manejo automático de la PGA
- Tablespaces en LMT con manejo automático de segmentos
- Etc,etc,etc

Pero hay un dato, bastante importante y para nada menor, que son las consultas cuando utilizamos por ejemplo, un Group By o un Distinct , en versiones anteriores a Oracle 10g, esto implicaba un ordenamiento, pero desde Oracle10g , esto ya no se produce, verdad!!! NO SE PRODUCE.

Veamos un ejemplo :

1)
Creamos en Oracle8i (8.1.7) una pequeña tabla de ejemplo, para realizar una carga de datos

2)
Le insertamos datos

3)
Cuando ejecutamos algún comando en el select que involucre ordenamiento, Oracle muestra los datos ordenados, por ejemplo , con un GROUP BY

4)
Ejecutamos un trace de la sentencia

Si nos damos cuenta , la operación para llevar a cabo el GROUP BY es una SORT GROUP BY

5)
Lo mismo sucede si llevamos a cabo una operación distinct , produce un ordenamiento implícito

6)
Al ver el plan de ejecución, para resolver la sentencia , utiliza la operación
SORT UNIQUE

¿Pero que sucede en Oracle10g?

7)Al crear la misma tabla, cargarla con los mismos datos y ejecutar las mismas sentencias, el resultado es diametralmente opuesto en cuanto a orden

8)
Si obtenemos un plan de ejecución de la sentencia, veremos que el algoritmo de ordenamiento a cambiado, ahora nos muestra un HASH GROUP BY , y los datos, ya no salen ordenados :'(

9)
Incluso en la sentencia distinct, ya no provoca un ordenamiento

10)
Y si vemos su plan de ejecución, pues ahora nos enseña el algoritmo HASH UNIQUE para resolver el distinct

11)
El comportamiento en Oracle10g se puede modificar, no cambiando el modo del optimizador, ni su versión, se puede cambiar simplemente indicandole a Oracle que no utilice las funciones de HASH para ordenamiento

12)
Ejecutamos nuevamente la consulta yyyy :yes: , nos muestra nuevamente ordenada la consulta

Esto puede ser muy bueno, por el aspecto visual, pero puede ser muy malo a nivel de performance, ya que el no utilizar las funciones HASH para ordenamiento, puede redundar en problemas de Performance, o es arreglar todo el código, o quizás, sólo quizás, haya unos pequeños problemas de performance.

13)
Si vemos el nuevo plan de ejecución, estando en Oracle10g, nos muestra las funciones de ordenamiento antiguas

Resumen : No todo es tan bueno como parece y si los algoritmos de ordenamiento en Oracle10g son más rápidos, nada asegura que salgan en orden y eso , para los pobres programadores puede resultar desastroso , pero a la larga es lo mejor, no hay comparación entre Oracle8i y Oracle10g.

Aunque se puede llevar a cabo una modificación de parámetros ocultos, para que el comportamiento de los ordenamientos sea similar en Oracle10g a las versiones antiguas.

Referencias :Nota 345048.1 : 'Group By' Does Not Sort If You Don'T Use Order By In 10g

by Ligarius
19.05.09. 12:59:32. 514 words, 5958 views. Categories: Base de datos, SQL / Programación, Tuning / Performance ,