このdual
テーブルは、他のテーブルの動作とほぼ同じように「機能」します。これは、レコードを選択できるテーブルです。
これは、たとえば、テーブルを説明できることを意味します。ここにありますSQL*Plus
:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
だから、テーブルには、名前の1列、持ってdummy
いますvarchar2(1)
。
設計上、テーブルには1つのレコードがあります(少なくとも誰もいじっていない場合)。
SQL> select count(*) from dual;
COUNT(*)
----------
1
だから、同じ動作を得るために、dual2
あなたが持っているようにdual
、あなたはデュアルに1つのレコードを挿入する必要があります。さらに良いことに、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
ため、インスタンスがディスク上の実際の値を読み取らないようにするために操作が実行されます。