sábado, 28 de marzo de 2015

El uso "Distinct , Unique y ALL" en Oracle SQL en el SELECT

Si queremos devolver la cantidad de registros que cumplen con la condición de ser distintos, es generalizado que utilicemos la palabra clave DISTINCT para dicho objetivo, en una declaración de lenguaje estructurado de consulta ( SQL ); pero que podamos utilizar la palabra UNIQUE para que podamos obtener el mismo efecto, si es una novedad para muchos.
 
Sin embargo, les voy a echar a perder la fiesta, ya que en versiones previas de Oracle Database ya se podía hacer esto.

Estas dos palabras clave son sinónimos en el lenguaje de programación en SQL dentro de Oracle.

Veamos su uso.

Vamos a utilizar el esquema SH de los esquemas de ejemplos de Oracle 12c y más específicamente la tabla SALES.

SQL> desc sales
 Name                  Null?    Type
 --------------------- -------- ----------------
 PROD_ID               NOT NULL NUMBER
 CUST_ID               NOT NULL NUMBER
 TIME_ID               NOT NULL DATE
 CHANNEL_ID            NOT NULL NUMBER
 PROMO_ID              NOT NULL NUMBER
 QUANTITY_SOLD         NOT NULL NUMBER(10,2)
 AMOUNT_SOLD           NOT NULL NUMBER(10,2)

Si procedemos a ejecutar la sentencia para contar la cantidad de valores distintos en la columna prod_id de la tabla SALES obtenemos el mismo resultado con ambas palabras claves.

SQL> select count(distinct prod_id) from sales;

COUNT(DISTINCTPROD_ID)
----------------------
                    72

SQL> select count(unique prod_id) from sales;

COUNT(UNIQUEPROD_ID)
--------------------
                  72

Elapsed: 00:00:00.08

Pero será lo mismo a nivel del plan de ejecución.?.

Validemos:

SQL> explain plan forselect count(distinct prod_id) from sales;
Explained.

SQL> select * from table(dbms_xplan.display);

SQL> set linesize 500
SQL> /

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------
| Id  | Operation                        | Name           | Rows  | Bytes | Cost (%CPU)|
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                |     1 |    13 |    22 (100)|
|   1 |  SORT AGGREGATE                  |                |     1 |    13 |            |
|   2 |   VIEW                           | VW_DAG_0       |    72 |   936 |    22 (100)|
|   3 |    HASH GROUP BY                 |                |    72 |   288 |    22 (100)|
|   4 |     PARTITION RANGE ALL          |                |   918K|  3589K|            |
|   5 |      BITMAP CONVERSION TO ROWIDS |                |   918K|  3589K|            |
|   6 |       BITMAP INDEX FAST FULL SCAN| SALES_PROD_BIX |       |       |            |
----------------------------------------------------------------------------------------

13 rows selected.

SQL> explain plan for
  2  select count( unique prod_id) from sales;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
Plan hash value: 3904576855

----------------------------------------------------------------------------------------
| Id  | Operation                        | Name           | Rows  | Bytes | Cost (%CPU)|
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                |     1 |    13 |    22 (100)|
|   1 |  SORT AGGREGATE                  |                |     1 |    13 |            |
|   2 |   VIEW                           | VW_DAG_0       |    72 |   936 |    22 (100)|
|   3 |    HASH GROUP BY                 |                |    72 |   288 |    22 (100)|
|   4 |     PARTITION RANGE ALL          |                |   918K|  3589K|            |
|   5 |      BITMAP CONVERSION TO ROWIDS |                |   918K|  3589K|            |
|   6 |       BITMAP INDEX FAST FULL SCAN| SALES_PROD_BIX |       |       |            |
----------------------------------------------------------------------------------------

13 rows selected.

Como puedes ver, tanto la palabra DISTINCT como UNIQUE, generan los mismos resultados y los mismos EXPLAIN PLAN dentro de la base de datos.
 
Cuál utilizar ?
 
El que te guste más.
 
Otra incorporación en el SQL para Oracle Database 12c, es la inclusión de la palabra clave "ALL", que viene a ser nada más y nada menos, que una forma elegante de decir, devuelva todos los valores incluyendo los duplicados.
 
SQL> select count(all prod_id) from sales;
 
COUNT(ALLPROD_ID)
-----------------
           918843
Elapsed: 00:00:00.07
SQL> select count(prod_id) from sales;
 
COUNT(PROD_ID)
--------------
        918843
Elapsed: 00:00:00.02
SQL>

No hay comentarios:

Publicar un comentario en la entrada

Te agradezco tus comentarios. Te esperamos de vuelta.