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.
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)
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.
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
-----------------
918843
Elapsed: 00:00:00.07
SQL> select count(prod_id) from sales;
COUNT(PROD_ID)
--------------
918843
--------------
918843
Elapsed: 00:00:00.02
SQL>
SQL>
No hay comentarios:
Publicar un comentario
Te agradezco tus comentarios. Te esperamos de vuelta.