Oracle SQL - 了解Dual表的工作原理

时间:2013-11-01 18:27:25

标签: sql oracle insert

在制作小型测试表的过程中,我在网上偶然发现了以下文章: (http://www.techonthenet.com/sql/insert.php)提供了有关如何在Oracle中插入多行固定值的以下解决方案:

Insert All
Into testTable (key, field1, field2) Values (1, 10, 'a')
Into testTable (key, field1, field2) Values (2, 20, 'b')
Into testTable (key, field1, field2) Values (3, 30, 'c')
Into testTable (key, field1, field2) Values (4, 40, 'd')
Select * from dual;

对偶的使用是我以前从未见过的,所以我开始做一些研究以了解它是如何工作的。我知道这个表是针对某些oracle语法的解决方法,但它如何完​​成这些任务仍然没有为我点击。我知道其他人也问过类似的问题(How does Oracle SELECT FROM dual work with multiple fields),但我还没有看到有人解释实际情况。

  • 这是一个参考技巧,他们能够使用单值表来实现,还是Oracle中的某些功能只是硬编码,当他们看到双表时会采取不同的行为?

  • 更具体地说,引用它如何允许上面的代码基本上循环遍历多个Into ... Values ...语句?

有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:6)

从功能上讲,dual只是一个单行表,您恰好可以指望它始终存在且始终只有1行。您可以轻松地创建自己的单行表并使用它而不是dual。或者您可以使用您知道将始终返回1行的查询(即select * from all_objects where rownum < 2)。

在幕后,Oracle可以针对dual优化查询,而不是针对您创建的单行表进行优化。优化器知道该表总是只有1行,因此它可以根据它进行优化。 Oracle可以使用"fast dual" operation来消除甚至打到表的需要,以避免执行任何逻辑I / O.这些优化并不是你在这样的查询中会注意到的事情,当你在紧密循环中点击dual来计算各种表达式时,它们可能很有用。

在这种情况下,select * from dual仅存在,因为多表INSERT语句需要查询作为源。通常,当您创建多表INSERT时,您将从源中选择数据并将其中的部分或全部插入到多个表中。但是,在这种情况下,您实际上并没有使用来自SELECT语句的数据,因此无论您选择什么或从中选择数据都无关紧要。