La dual
tabla "funciona" casi como funciona cualquier otra tabla: es una tabla de la que puede seleccionar registros.
Esto significa, por ejemplo, que puede describir la tabla. Aquí, en SQL*Plus
:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
Entonces, la tabla tiene una columna, llamada dummy
cual es a varchar2(1)
.
La tabla tiene, por diseño, un registro (al menos si nadie jugueteó con ella):
SQL> select count(*) from dual;
COUNT(*)
----------
1
Entonces, para obtener el mismo comportamiento con el dual2
que tiene dual
, debe insertar un registro en dual. Mejor aún, create table as select
créelo con un (ctas):
SQL> create table dual2 as select * from dual;
Ahora, su consulta funciona:
SQL> select 4*5 from dual2;
4*5
----------
20
Anteriormente, dije que dual casi funciona como cualquier otra tabla. Entonces, ¿ cuándo no funciona como cualquier otra mesa?
Se comporta de manera diferente si no se selecciona ningún valor de la tabla en sí. Nuevamente, con sus consultas, dejo que Oracle las explique ...
SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;
EXPLAIN PLAN ausgef³hrt.
... para ver cómo se accede a la tabla:
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 3445655939
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL2 | 1 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------
Se puede ver que la declaración hace un full table access
encendido dual2
.
Ahora, lo mismo con dual
:
SQL> explain plan for select 4*5 from dual;
EXPLAIN PLAN ausgef³hrt.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------
Plan hash value: 1388734953
-----------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------
Aquí es donde la dual
tabla se comporta de manera diferente: el valor de dummy
no es necesario, por lo fast dual
que se ejecuta una operación para que la instancia no lea el valor real en el disco.