当 table 在 Oracle 中有这么多索引时,如何提高插入的性能?
How to imporve performace of an insert when a table has so many indexes in Oracle?
我们有一个 table,上面有大约 100 个索引。因此,当我尝试向此 table 中插入大量行时,执行插入需要花费太多时间。我尝试了 PARALLEL 和 APPEND 提示,但没有太大帮助。
在这种情况下,还有其他方法可以提高插入性能吗? (我不想禁用然后启用触发器)
使用解释计划来确保您正确使用追加和并行提示 - 这些提示有很多方法可能出错。
下面是大型数据仓库语句的良好解释计划示例:
create table test1(a number);
explain plan for
insert /*+ append parallel enable_parallel_dml */ into test1
select 1 from test1;
select * from table(dbms_xplan.display);
Plan hash value: 1209398148
--------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 2 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 1 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | LOAD AS SELECT (HYBRID TSM/HWMB)| TEST1 | | | | Q1,00 | PCWP | |
| 4 | OPTIMIZER STATISTICS GATHERING | | 1 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
| 5 | PX BLOCK ITERATOR | | 1 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |
| 6 | TABLE ACCESS FULL | TEST1 | 1 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
--------------------------------------------------------------------------------------------------------------------
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1 (U - Unused (1))
---------------------------------------------------------------------------
0 - STATEMENT
U - parallel
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
- automatic DOP: Computed Degree of Parallelism is 2
为了获得良好的并行直接路径性能,这些是在解释计划中要寻找的主要内容:
- 确保使用直接路径写入。“LOAD AS SELECT”表示附加提示有效,“INSERT CONVENTIONAL”表示未使用提示。无法使用直接路径的可能原因有很多,其中最常见的是未启用并行 DML,这就是第三个提示所做的。 (在 12c 之前,您必须 运行
alter session enable parallel dml
。)
- 确保读取和写入都使用并行性。在“LOAD AS SELECT”之前和之后都应该有一个“PX”操作。如果之前没有操作,则写入不是并行完成的。
- 确保并行度正确。 解释计划将告诉您所请求的并行度。 DOP 很难得到正确的并且受许多因素的影响。如果您的 DOP 似乎有误,请使用 this checklist 查找可能的问题。
如果仍有问题,请使用 SQL 监控报告查找有关实际执行计划、行、时间和等待事件的信息。生成报告通常与 select dbms_sqltune.report_sql_monitor('your SQL_ID') from dual
一样简单。如果你 post 这里的结果,有人可能会找到提高性能的方法。
我们有一个 table,上面有大约 100 个索引。因此,当我尝试向此 table 中插入大量行时,执行插入需要花费太多时间。我尝试了 PARALLEL 和 APPEND 提示,但没有太大帮助。
在这种情况下,还有其他方法可以提高插入性能吗? (我不想禁用然后启用触发器)
使用解释计划来确保您正确使用追加和并行提示 - 这些提示有很多方法可能出错。
下面是大型数据仓库语句的良好解释计划示例:
create table test1(a number);
explain plan for
insert /*+ append parallel enable_parallel_dml */ into test1
select 1 from test1;
select * from table(dbms_xplan.display);
Plan hash value: 1209398148
--------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 2 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 1 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | LOAD AS SELECT (HYBRID TSM/HWMB)| TEST1 | | | | Q1,00 | PCWP | |
| 4 | OPTIMIZER STATISTICS GATHERING | | 1 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
| 5 | PX BLOCK ITERATOR | | 1 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |
| 6 | TABLE ACCESS FULL | TEST1 | 1 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
--------------------------------------------------------------------------------------------------------------------
Hint Report (identified by operation id / Query Block Name / Object Alias):
Total hints for statement: 1 (U - Unused (1))
---------------------------------------------------------------------------
0 - STATEMENT
U - parallel
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
- automatic DOP: Computed Degree of Parallelism is 2
为了获得良好的并行直接路径性能,这些是在解释计划中要寻找的主要内容:
- 确保使用直接路径写入。“LOAD AS SELECT”表示附加提示有效,“INSERT CONVENTIONAL”表示未使用提示。无法使用直接路径的可能原因有很多,其中最常见的是未启用并行 DML,这就是第三个提示所做的。 (在 12c 之前,您必须 运行
alter session enable parallel dml
。) - 确保读取和写入都使用并行性。在“LOAD AS SELECT”之前和之后都应该有一个“PX”操作。如果之前没有操作,则写入不是并行完成的。
- 确保并行度正确。 解释计划将告诉您所请求的并行度。 DOP 很难得到正确的并且受许多因素的影响。如果您的 DOP 似乎有误,请使用 this checklist 查找可能的问题。
如果仍有问题,请使用 SQL 监控报告查找有关实际执行计划、行、时间和等待事件的信息。生成报告通常与 select dbms_sqltune.report_sql_monitor('your SQL_ID') from dual
一样简单。如果你 post 这里的结果,有人可能会找到提高性能的方法。