当 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

为了获得良好的并行直接路径性能,这些是在解释计划中要寻找的主要内容:

  1. 确保使用直接路径写入。“LOAD AS SELECT”表示附加提示有效,“INSERT CONVENTIONAL”表示未使用提示。无法使用直接路径的可能原因有很多,其中最常见的是未启用并行 DML,这就是第三个提示所做的。 (在 12c 之前,您必须 运行 alter session enable parallel dml。)
  2. 确保读取和写入都使用并行性。在“LOAD AS SELECT”之前和之后都应该有一个“PX”操作。如果之前没有操作,则写入不是并行完成的。
  3. 确保并行度正确。 解释计划将告诉您所请求的并行度。 DOP 很难得到正确的并且受许多因素的影响。如果您的 DOP 似乎有误,请使用 this checklist 查找可能的问题。

如果仍有问题,请使用 SQL 监控报告查找有关实际执行计划、行、时间和等待事件的信息。生成报告通常与 select dbms_sqltune.report_sql_monitor('your SQL_ID') from dual 一样简单。如果你 post 这里的结果,有人可能会找到提高性能的方法。