日期:2014-05-16  浏览次数:20474 次

Oracle中dual的意思

这是个虚拟表,在操作大多数Oracle对象的时候都可以使用这个表,比如sequence,sysdate等等。
比如select sysdate from dual
select seq1.nextval from dual
等等,一般也就是用来做这个事情的

dual之所以叫虚拟表,因为它里面并没有什么有效的内容!我的理解是:因为SQL语句的基本结构是Select ? ... ? From ? ... ? ,From作为SQL语句的毕加项是不可以省略的。而通过SQL语句取得数据库的一些对象值(如:序列,系统日期等等),From就必不可少,所以就出现了Dual这个表。

例如:select ? f ? from ? dual ? 中的f
可以是任何合法的表达式,用于得到某些特殊功能,但该表达式中不能包含属于某个表(或视图)中的字段或多个字段。例如日期函数,算术表达式、自定义函数、序列等等。
select ? trunc(sysdate),round(3.232,2) ? from ? dual;
select ? 42*2+2 ? from ? dual;
select ? seq.nextval ? from ? dual;
select ? 1 ? from ? dual ? where ? ...
该虚表中永远都只有一条记录。

1. dual 是由 sql.bsq 建立的。每个database 在建立的时候, sql.bsq 都需要run 一次的。所以每个database 都会有dual table 的。

2. DUAL 的owner 是谁? ?-- SYS
? (select owner, table_name from dba_tables where table_name='DUAL'

3. ?什么时候经常用到dual table?

我自己最常用的是,在batch script 做 time stamps.
connect internal;
select to_char(sysdatE, 'YY-MON-DD HH:MI') FROM DUAL;
................

至 于运算或者看sequence 的value 使用得却是不多。可能做开发的人员用的比较多。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

关 于dual 引起的Performance 的问题。

如果没有用很多dual的话,似乎不用考虑的。我尚未见过一天需要 access 千次以上dual 的数据库。但是根据文章,给dual 建立index 是个好办法(8i 及以前),并且要常做 analy table dual comput statistics。

或者将X$DUAL 使用where 来建立一个view,可以使其存在memory 里面,如果常使用的话,就会降低performance cost。