暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

被人忽略功能强大HINTS

Oracle蓝莲花 2021-04-15
1377





9


星期日

2018年12月

1.IGNORE_ROW_ON_DUPKEY_INDEX Hint官方介绍及其解释说明如下:
The IGNORE_ROW_ON_DUPKEY_INDEX hint applies only to single-table INSERT operations. It is not supported for UPDATE, DELETE, MERGE, or multitable insert operations. IGNORE_ROW_ON_DUPKEY_INDEX causes the statement to ignore a unique key violation for a specified set of columns or for a specified index. When a unique key violation is encountered, a row-level rollback occurs and execution resumes with the next input row. If you specify this hint when inserting data with DML error logging enabled, then the unique key violation is not logged and does not cause statement termination.

IGNORE_ROW_ON_DUPKEY_INDEX提示只应用于单表插入操作。它不支持更新、删除、合并或多表插入操作。IGNORE_ROW_ON_DUPKEY_INDEX导致语句忽略了对指定的列或指定索引的唯一键违反。当遇到惟一的关键违规时,将执行行级回滚,并使用下一个输入行恢复执行。如果在启用DML错误日志的情况下插入数据时指定了这个提示,那么唯一的键违背就不会被记录下来,也不会导致语句终止

The semantic effect of this hint results in error messages if specific rules are violated:
如果违反了特定的规则,这个提示的语义效果会导致错误消息

If you specify index, then the index must exist and be unique. Otherwise, the statement causes ORA-38913.
如果指定索引,则索引必须存在并且是惟一的。否则,语句导致ora - 38913

You must specify exactly one index. If you specify no index, then the statement causes ORA-38912. If you specify more than one index, then the statement causes ORA-38915.
必须指定一个索引。如果没有指定索引,则语句导致ora - 38912。如果指定多个索引,则说明将导致ora -38915

You can specify either a CHANGE_DUPKEY_ERROR_INDEX or IGNORE_ROW_ON_DUPKEY_INDEX hint in an INSERT statement, but not both. If you specify both, then the statement causes ORA-38915.
可以在INSERT语句中指定CHANGE_DUPKEY_ERROR_INDEXIGNORE_ROW_ON_DUPKEY_INDEX提示,但不能同时指定两者。如果两者都指定,则语句导致ora -38915

As with all hints, a syntax error in the hint causes it to be silently ignored. The result will be that ORA-00001 will be caused, just as if no hint were used.

··




01

  雪  



2.IGNORE_ROW_ON_DUPKEY_INDEX Hint官方介绍及其解释说明如下:
The CHANGE_DUPKEY_ERROR_INDEX hint provides a mechanism to unambiguously identify a unique key violation for a specified set of columns or for a specified index. When a unique key violation occurs for the specified index, an ORA-38911 error is reported instead of an ORA-001.
CHANGE_DUPKEY_ERROR_INDEX提示提供了一种机制,以明确地标识特定的一组列或指定索引的唯一关键违规。当指定索引出现唯一的关键违规时,将会报告ora - 38911错误,而不是ora - 001

This hint applies to INSERT, UPDATE operations. If you specify an index, then the index must exist and be unique. If you specify a column list instead of an index, then a unique index whose columns match the specified columns in number and order must exist.
这个提示适用于插入、更新操作。如果指定索引,则索引必须存在并且是惟一的。如果您指定了列列表而不是索引,那么就必须存在一个惟一的索引,它的列与数量和顺序中指定的列相匹配

This use of this hint results in error messages if specific rules are violated. Refer to IGNORE_ROW_ON_DUPKEY_INDEX Hint for details.
如果违反了特定的规则,这个提示将导致错误消息。引用IGNORE_ROW_ON_DUPKEY_INDEX

This hint disables both APPEND mode and parallel DML.
这个提示禁用了APPEND模式和并行DML

The CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, and RETRY_ON_ROW_CHANGE hints are unlike other hints in that they have a semantic effect. The general philosophy explained in Hints does not apply for these three hints.
CHANGE_DUPKEY_ERROR_INDEX、IGNORE_ROW_ON_DUPKEY_INDEX和RETRY_ON_ROW_CHANGE




02

  飘  




3.RETRY_ON_ROW_CHANGE Hint官方介绍及其解释说明如下:
The CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, and RETRY_ON_ROW_CHANGE hints are unlike other hints in that they have a semantic effect. The general philosophy explained in Hints does not apply for these three hints

This hint is valid only for UPDATE and DELETE operations. It is not supported for INSERT or MERGE operations. When you specify this hint, the operation is retried when the ORA_ROWSCN for one or more rows in the set has changed from the time the set of rows to be modified is determined to the time the block is actually modified.
此提示只适用于更新和删除操作。它不支持插入或合并操作。当您指定这个提示时,当ORA_ROWSCN在集合中有一个或多个行已从需要修改的行集时更改时,操作将被重新尝试,以确定该块实际上已被修改的时间




03

  融  



阶段性总结:
如上三个官方介绍的hint CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX, RETRY_ON_ROW_CHANGE与其他提示不同,特别之处在于存在“语义效果(semantic effect)”。
“semantic effect”指在违反以下规则时该提示会导致错误信息:
*如果指定了索引名称,该索引必须存在且唯一;否则会导致ORA-38913错误;
*如果指定索引,必须指定一个索引。如果未指定索引,会导致ORA-38912错误;

如果指定了多个索引,会导致ORA-38915错误。
*不能同时指定CHANGE_DUPKEY_ERROR_INDEX和IGNORE_ROW_ON_DUPKEY_INDEX提示;否则会导致ORA-38915错误。
提示CHANGE_DUPKEY_ERROR_INDEX有两种用法,一种是指定索引的名称,另一种是指明所有构成索引的列。
需要注意的是,这个HINT只对唯一索引生效,而对唯一约束无效

4.IGNORE_ROW_ON_DUPKEY_INDEX Hint案例说明及其Hints使用情况分析:
针对具有唯一性约束的主键和唯一索引,当插入重复数据键值时候会报错ORA-00001,传统解决方案可以通过DBMS_ERRORLOG
方式去解决,但有时候修改程序代码会比较麻烦,11G以后版本引入IGNORE_ROW_ON_DUPKEY_INDEX Hint,在insert 单表的语句
中加入该hint可以让oracle忽略哪些具有重复键值的行,不触发ORA-00001错误,程序可以继续运行。以下为具体案例实验:

--创建测试表并创建唯一索引

--为了迎合案例准确性做如下操作,生产环境切勿操作

--DML操作

--PL/SQL匿名块消耗趋势分析:

分析以上PL/SQL匿名块消耗:
1.子游标使用的共享内存的数量:57194 1024=55.85M
2.PL/ SQL执行时间11928微妙
3.此游标用于解析、执行和获取的CPU时间458698微妙
4.用于解析、执行和获取的游标使用的时间671658微妙,由于游标未使用并行执行,则ELAPSED_TIME不计算查询协调器的累计时间,以及所有并行查询从属进程时间
5.用户I O等待209913微妙
--在插入前判断插入值是否违反唯一约束,第二次案例测试

分析以上PL/SQL匿名块消耗:
1.子游标使用的共享内存的数量:57194 / 1024=55.85M
2.PL/ SQL执行时间11928微妙
3.此游标用于解析、执行和获取的CPU时间458698微妙
4.用于解析、执行和获取的游标使用的时间671658微妙,由于游标未使用并行执行,则ELAPSED_TIME不计算查询协调器的累计时间,以及所有并行查询从属进程时间
5.用户I / O等待209913微妙
SELECT*FROM T_600_DEMO  
--测试IGNORE_ROW_ON_DUPKEY_INDEX hint性能消耗:

分析以上PL/SQL匿名块消耗:
1).子游标使用的共享内存的数量:24164 / 1024=23M
2).PL/ SQL执行时间2665513微妙
3).此游标用于解析、执行和获取的CPU时间16239303微妙
4).用于解析、执行和获取的游标使用的时间16248553微妙,由于游标未使用并行执行,则ELAPSED_TIME不计算查询协调器的累计时间,以及所有并行查询从属进程时间
5).用户I / O等待1063微妙
IGNORE_ROW_ON_DUPKEY_INDEX hint模式下,
CPU_TIME对比Exception模式时减少11%,但仍远高于插入前预检查模式


5.CHANGE_DUPKEY_ERROR_INDE Hint案例说明及其Hints使用情况分析:
如果发生违反唯一主键冲突,则返回错误号为ORA-00001,而在11.2中,Oracle提供了改变错误号的方法,使用这个CHANGE_DUPKEY_ERROR_INDEX提示,指定的索引违反唯一约束后,返回的错误为ORA-3891
例如我们提交如下查询:
SELECT T.*,T.ROWID FROM T_600_DEMO T
INSERT /*+ APPEND_VALUES */ INTO T_600_DEMO VALUES(1,'Description','Demo');
ORA-00001违反唯一约束条件(ETL.IDX_600_DEMO)

我们在提交如下操作:
INSERT /*+ CHANGE_DUPKEY_ERROR_INDEX(T_600_DEMO,IDX_600_DEMO) */ INTO T_600_DEMO VALUES(1,'Description','Demo');
ORA-38911 :违反唯一约束条件(ETL.IDX_600_DEMO)
======================================
6.RETRY_ON_ROW_CHANGE Hint案例说明及其Hints使用情况分析:
测试方法同上



- END -




600团队

QQ群851604218

扫描二维码

有问题私我哦~


文章转载自Oracle蓝莲花,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论