如何解决当一个表在 Oracle 中有这么多索引时,如何提高插入的性能?
我们有一个表,上面有大约 100 个索引。因此,当我尝试向该表中插入大量行时,执行插入需要太多时间。我尝试了 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
一样简单。如果您在此处发布结果,那么可能有人可以找到提高性能的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。