Mucho se habla sobre la diferencia entre group by y Distinct, la verdad es que en oracle parece no tener diferencia.Hice algunas pruebas para poder decir que son prácticamente lo mismo.Empecé con los siguientes:
SQL> explain plan for
2 SELECT DISTINCT campo1 FROM prueba;
Explicado.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------
Plan hash value: 643035693
-----------------------------------------------------------------------------
Id Operation Name Rows Bytes Cost (%CPU) Time
-----------------------------------------------------------------------------
0 SELECT STATEMENT 1 5 4 (25) 00:00:01
1 HASH UNIQUE 1 5 4 (25) 00:00:01
2 TABLE ACCESS FULL PRUEBA 1 5 3 (0) 00:00:01
-----------------------------------------------------------------------------
SQL> explain plan for
2 SELECT campo1 FROM prueba GROUP BY campo1;
Explicado.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
Plan hash value: 287650557
-----------------------------------------------------------------------------
Id Operation Name Rows Bytes Cost (%CPU) Time
-----------------------------------------------------------------------------
0 SELECT STATEMENT 1 5 4 (25) 00:00:01
1 HASH GROUP BY 1 5 4 (25) 00:00:01
2 TABLE ACCESS FULL PRUEBA 1 5 3 (0) 00:00:01
-----------------------------------------------------------------------------
Como se puede ver lo único que cambia es el "HASH UNIQUE" por "HASH GROUP", el resto del plan parece ser igual.
Al ser una función hash, decidí incrementar la prueba a un set de datos más grande (suficiente para que mi PGA se quedara corta y se tuviera que pasar la tabla de hash a disco). Decidí también poner un trace nivel 10104 al proceso para ver la creación de la tabla de hash.
Las sentencias SQL son las siguientes:
WITH registros AS
(SELECT /*+MATERIALIZE*/
owner,
object_type
FROM dba_objects)
SELECT COUNT(*)
FROM
(SELECT owner,
object_type rownum
FROM
(SELECT a.owner,
b.object_type
FROM registros a,
registros b
WHERE rownum < 1000000)
GROUP BY owner,
object_type rownum);
WITH registros AS
(SELECT /*+MATERIALIZE*/
owner,
object_type
FROM dba_objects)
SELECT COUNT(*)
FROM
(SELECT DISTINCT owner,
object_type rownum
FROM
(SELECT a.owner,
b.object_type
FROM registros a,
registros b
WHERE rownum < 1000000));
Las pruebas que realicé fueron las siguientes:
SQL> oradebug setmypid
Sentencia procesada.
SQL> oradebug event 10104 trace name context forever, level 12;
Sentencia procesada.
SQL> WITH registros AS
2 (SELECT /*+MATERIALIZE*/
...
15 WHERE rownum < 1000000));
COUNT(*)
----------
999999
SQL> oradebug tracefile_name
c:\oracle\product\admin\orcl\udump\orcl_ora_5272.trc
En ambas situaciones, las tablas de hash fueron exactamente las mismas...
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario