【问题标题】:How to imporve performace of an insert when a table has so many indexes in Oracle?当一个表在Oracle中有这么多索引时,如何提高插入的性能?
【发布时间】:2021-05-21 12:36:17
【问题描述】:

我们有一个表,上面有大约 100 个索引。因此,当我尝试向该表中插入大量行时,执行插入需要花费太多时间。我尝试了 PARALLEL 和 APPEND 提示,但没有太大帮助。

在这种情况下,还有其他方法可以提高插入性能吗? (我不想禁用然后启用触发器)

【问题讨论】:

  • 你试过 sql loader (sqlldr) 命令行工具吗?
  • 您最初提到索引,然后以关于禁用和启用触发器的评论结束。你知道究竟是什么导致了缓慢吗?是索引维护吗?还是运行触发器?或者别的什么(未索引的外键是一个相对常见的外键)?例如,如果性能问题是您有昂贵的行级触发器(可能部分是因为它们强制每行进行上下文转换),那与索引维护问题大不相同。
  • 100 个索引 - 非常令人印象深刻!它们都是必需的吗?您可以监控索引的使用情况。请注意,Oracle 能够在您运行查询时组合多个索引。您不需要为每个可能的查询使用专用的复合索引。

标签: oracle query-optimization oracle12c database-performance database-administration


【解决方案1】:

使用解释计划确保您正确使用附加提示和并行提示 - 这些提示有很多可能出错的方法。

以下是大型数据仓库语句的良好解释计划示例:

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 一样简单。如果您在此处发布结果,有人可能会找到提高性能的方法。

【讨论】:

    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 2019-10-17
    • 2016-08-13
    • 2017-11-19
    • 2012-01-23
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多