该dual
表几乎可以像其他任何表一样工作:它是一个表,您可以从中选择记录。
例如,这意味着您可以描述表格。在这里SQL*Plus
:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
所以,这个表有一列,命名dummy
这是一个varchar2(1)
。
通过设计,该表具有一个记录(至少如果没有人摆弄它):
SQL> select count(*) from dual;
COUNT(*)
----------
1
因此,为了得到与相同的行为dual2
,你有dual
,你必须插入一条记录成双。更好的是,使用create table as select
(ctas)创建它:
SQL> create table dual2 as select * from dual;
现在,您的查询有效:
SQL> select 4*5 from dual2;
4*5
----------
20
之前,我说过对偶几乎与其他任何表一样工作。那么,什么时候它不能像其他任何表一样工作?
如果未从表本身中选择任何值,则其行为会有所不同。再次,根据您的查询,我让Oracle对其进行解释 ...
SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;
EXPLAIN PLAN ausgef³hrt.
...以查看如何访问该表:
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 |
-------------------------------------------------------------------
可以看出该语句执行full table access
on dual2
。
现在,与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 |
-----------------------------------------------------------------
这是dual
表行为不同的地方:dummy
不需要的值,因此将fast dual
执行操作,以使实例不读取磁盘上的实际值。