我听说有人提到这张桌子,但不确定是什么。
我听说有人提到这张桌子,但不确定是什么。
Answers:
这是一种带有单个记录的伪表,用于在您实际上对数据不感兴趣时选择,而是在select语句中希望某些系统函数的结果:
例如 select sysdate from dual;
来自维基百科
历史
DUAL表是由Oracle公司的Chuck Weiss创建的,用于提供用于内部视图联接的表:
我将DUAL表创建为Oracle数据字典中的基础对象。从来没有想过要看到它本身,而是在希望查询的视图中使用它。想法是您可以对DUAL表进行JOIN并为表中的每一行在结果中创建两行。然后,通过使用GROUP BY,可以汇总结果联接以显示DATA扩展区和INDEX扩展区的存储量。名称DUAL似乎很适合仅从一个行创建一对行的过程。1个
从上面可能看不出来,但是原始DUAL表中有两行(因此得名)。如今,它只有一行。
优化
DUAL最初是一个表,并且从DUAL中进行选择时,数据库引擎将在表上执行磁盘IO。该磁盘IO通常是逻辑IO(不涉及物理磁盘访问),因为磁盘块通常已经缓存在内存中。这导致针对DUAL表的大量逻辑IO。
Oracle数据库的更高版本已经过优化,即使DUAL表实际上仍然存在,该数据库也不再在DUAL表上执行物理或逻辑IO。
我认为这篇维基百科文章可能有助于澄清。
http://en.wikipedia.org/wiki/DUAL_table
DUAL表是一种特殊的单行表,默认情况下在所有Oracle数据库安装中都存在。它适用于选择伪列,例如SYSDATE或USER。该表具有一个称为DUMMY的VARCHAR2(1)列,其值是“ X”
您可以针对某种伪表运行命令并获取结果,例如sysdate。还可以帮助您检查Oracle是否已启动并检查sql语法等。
有关DUAL的更多事实...
http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::::P11_QUESTION_ID:1562813956388
此处进行了激动人心的实验,汤姆提供了更多激动人心的解释
DUAL表是一种特殊的单行表,默认情况下在所有Oracle数据库安装中都存在。它适用于选择伪列,例如SYSDATE或USER
该表具有一个称为DUMMY的VARCHAR2(1)列,其值是“ X”
您可以在http://en.wikipedia.org/wiki/DUAL_table中阅读全部内容
从返回1空行中放入的对象。例如:从对偶中选择1;在对偶中选择1。返回1
从双选21 + 44; 返回65
从对偶中选择[sequence] .nextval;返回序列中的下一个值。
DUAL我们主要用于从序列中获取下一个数字。
语法:SELECT'sequence_name'.NEXTVAL FROM DUAL
这将返回一行一列的值(NEXTVAL列名)。
另一个需要解决的情况 select ... from dual
是,当我们想使用内置DBMS_METADATA.GET_DDL
函数检索不同数据库对象(例如TABLE,FUNCTION,TRIGGER,PACKAGE)的代码(数据定义)时:
select DBMS_METADATA.GET_DDL('TABLE','<table_name>') from DUAL;
select DBMS_METADATA.GET_DDL('FUNCTION','<function_name>') from DUAL;
确实,当今的IDE确实提供了查看表的DDL的功能,但是在像SQL Plus这样的简单环境中,这确实非常方便。
编辑
更普遍的情况:基本上,当我们需要在标准SQL语句中使用任何PL / SQL过程时,或者当我们想从命令行调用过程时:
select my_function(<input_params>) from dual;
这两个食谱均摘自Josh Juneau和Matt Arena的书《 Oracle PL / SQL食谱》