Oracle 中未记录 table
Unlogged table in Oracle
我正在研究PostGreSQL,看到一个unlogged的例子table。
Oracle 中是否有类似的资源?
我在 Oracle 中有一个小提取器,该日记填充 table 然后生成一个文本文件。之后,这个 table 被清理,但没有被丢弃。
我知道这个 "temporary table" 可以取消记录,因为它根本不是一项业务 table。
Oracle tables 可以创建为 NOLOGGING
。这类似于 PostgreSQL UNLOGGED 选项,但我确信在实现上存在很多差异。
即使 table 创建为 NOLOGGING
只有特定操作将使用直接路径插入(即 INSERT
直接写入数据文件而不生成大量 REDO 或 UNDO)。而 DML 通常必须使用如下所示的 APPEND
提示。如果看到 LOAD AS SELECT
.
,则可以判断是否使用了直接路径写入
SQL> create table test1(a number) nologging;
Table created.
SQL> explain plan for insert /*+ append */ into test1 select 1 from dual;
Explained.
SQL> select * from table(dbms_xplan.display);
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------
Plan hash value: 2781518217
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | LOAD AS SELECT | TEST1 | | | |
| 2 | OPTIMIZER STATISTICS GATHERING | | 1 | 2 (0)| 00:00:01 |
| 3 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------
直接路径写入有许多奇怪的限制。犯一个小错误并最终使用传统插入物是很常见的。在下面的示例中,提示没有正确的语法。没有错误或警告,只有解释计划显示 LOAD TABLE CONVENTIONAL
.
SQL> explain plan for insert /* append */ into test1 select 1 from dual;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
Plan hash value: 1388734953
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | LOAD TABLE CONVENTIONAL | TEST1 | | | |
| 2 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
9 rows selected.
我正在研究PostGreSQL,看到一个unlogged的例子table。 Oracle 中是否有类似的资源? 我在 Oracle 中有一个小提取器,该日记填充 table 然后生成一个文本文件。之后,这个 table 被清理,但没有被丢弃。 我知道这个 "temporary table" 可以取消记录,因为它根本不是一项业务 table。
Oracle tables 可以创建为 NOLOGGING
。这类似于 PostgreSQL UNLOGGED 选项,但我确信在实现上存在很多差异。
即使 table 创建为 NOLOGGING
只有特定操作将使用直接路径插入(即 INSERT
直接写入数据文件而不生成大量 REDO 或 UNDO)。而 DML 通常必须使用如下所示的 APPEND
提示。如果看到 LOAD AS SELECT
.
SQL> create table test1(a number) nologging;
Table created.
SQL> explain plan for insert /*+ append */ into test1 select 1 from dual;
Explained.
SQL> select * from table(dbms_xplan.display);
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------
Plan hash value: 2781518217
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | LOAD AS SELECT | TEST1 | | | |
| 2 | OPTIMIZER STATISTICS GATHERING | | 1 | 2 (0)| 00:00:01 |
| 3 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------
直接路径写入有许多奇怪的限制。犯一个小错误并最终使用传统插入物是很常见的。在下面的示例中,提示没有正确的语法。没有错误或警告,只有解释计划显示 LOAD TABLE CONVENTIONAL
.
SQL> explain plan for insert /* append */ into test1 select 1 from dual;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
Plan hash value: 1388734953
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | LOAD TABLE CONVENTIONAL | TEST1 | | | |
| 2 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
9 rows selected.