Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle中,当一个表有这么多索引时,如何提高插入的性能?_Oracle_Query Optimization_Oracle12c_Database Performance_Database Administration - Fatal编程技术网

在Oracle中,当一个表有这么多索引时,如何提高插入的性能?

在Oracle中,当一个表有这么多索引时,如何提高插入的性能?,oracle,query-optimization,oracle12c,database-performance,database-administration,Oracle,Query Optimization,Oracle12c,Database Performance,Database Administration,我们有一个表,上面有大约100个索引。因此,当我尝试向该表中插入大量行时,执行插入操作需要花费太多时间。我尝试了并行和附加提示,但没有多大帮助 在这种情况下,是否有其他方法可以提高插入性能?(我不想先禁用然后再启用触发器)使用解释计划来确保正确使用追加和并行提示-这些提示可能会出现错误的方法有很多 下面是一个针对大型数据仓库语句的良好解释计划示例: create table test1(a number); explain plan for insert /*+ append parallel

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


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

使用解释计划来确保正确使用追加和并行提示-这些提示可能会出现错误的方法有很多

下面是一个针对大型数据仓库语句的良好解释计划示例:

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
为了获得良好的并行直接路径性能,以下是解释计划中需要注意的主要事项:

  • 确保使用直接路径写入。“加载为选择”表示追加提示有效,“插入常规”表示未使用提示。无法使用直接路径有很多可能的原因,其中最常见的原因是没有启用并行DML,这就是第三个提示所做的。(在12c之前,您必须运行
    alter session enable parallel dml
  • 确保读写都使用并行。在“选择加载”之前和之后都应该有“PX”操作。如果之前没有操作,那么写操作就不会并行完成
  • 确保并行度正确。解释计划将告诉您所需的并行度。DOP很难得到正确的结果,并且受到许多因素的影响。如果您的DOP似乎有误,请使用查找可能的问题

  • 如果仍然存在问题,请使用SQL监控报告查找有关实际执行计划、行、时间和等待事件的信息。生成报告通常很简单,只要
    从dual
    选择dbms\u sqltune.report\u sql\u monitor(“您的sql\u ID”)。如果您在此处发布结果,可能有人会找到提高性能的方法。

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