暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
Hint的常见错误使用方式.pdf
215
10页
0次
2024-02-23
免费下载
Hint 的常见错误使用方式
提起 Oracle 数据库的 Hint几乎每一个 DBA 都知道这一强大工具。 Oracle 中,Hint 可以
用来改变 SQL 的执行计划、固定 SQL 的执行计划。Oracle 数据库内部的很多特性也依
Hint,比如 OutlineProfile 等。
但是在日常工作中,很多开发人员或 DBA,对 Hint 的使用仍然存在一些错误的方式。下面
将列举主要的 2 种。(本文不讨论 Hint 的滥用即过度使用问题)
1. NOLOGGING 的不正确使用。
很多人知道,在进行数据处理时,如果不产生日志或只产生少量的日志,将会有明显的、
至是巨大的效率提升。下面有几条不同的 SQL
view plain copy to clipboard print ?
INSERT INTO T1 NOLOGGING;
INSERT INTO T1 SELECT * FROM T2 NOLOGGING;
INSERT /*+ NOLOGGING */ INTO T1 VALUES ('0');
INSERT /*+ NOLOGGING */ INTO T1 SELECT * FROM T2;
DELETE /*+ NOLOGGING */ FROM T1;
UPDATE /*+ NOLOGGING */ T1 SET A='1';
实际上,上述所有的 SQL 没有一个能够实现不产生日志的数据更改操作。第 1-2 SQL
语句虽然没有将 NOLOGGING 写为 Hint 的形式,但是也是很多人的错误写法,一并列
处。事实上,NOLOGGING 并不是 Oracle 的一个有效的 Hint,而是一个 SQL 关键字,
用于 DDL 语句中。这里 NOLOGGING 相当于给 SELECT 的表指定了一个别名为“NOLOGGING
下面是 NOLOGGING 的一些正确用法:
view plain copy to clipboard print ?
CREATE TABLE T1 NOLOGGING AS SELECT * FROM T2;
CREATE INDEX T1_IDX ON T1(A) NOLOGGING;
ALTER INDEX T1_IDX REDUILD ONLINE NOLOGGING;
ALTER TABLE T1 NOLOGGING;
上述 SQL 中,最后一条 SQL 只是将表的 LOGGING 属性改为"NO"而之前的几条 SQL 能够
有效地减少 DDL 操作时减少的日志量。
DML 操作中,只有下面一种方式能够在大数据量时仍然只会产生极少量的日志:
view plain copy to clipboard print ?
INSERT /*+ APPEND */ INTO T1 SELECT * FROM T2;
也就是使用 append hint。但是这个 hint 要达到目的,需要以下几个条件:
使用 INSERT /*+ APPEND */ INTO .. SELECT .. FROM 形式的 INSERT SQL
如果是在归档模式下,需要将表的 LOGGING 属性置为 NO
表空间或数据库的 FORCE LOGGING 属性为 NO注意在非归档模式下也是可以设置 FORCE
LOGGING 的。
这里提到的 insert 语句中的 append hint,对于索引,仍然会产生日志,也就是说 append
hint 对索引是没有效果的。
另外,DDL 中使用的 nologging 关键字和 inset 语句中使用的 append hint并不是说完全
产生日志,只是对表的数据块的数据部分的更改不会有日志产生,但是 SQL 执行过程中数
据字典的更改、空间分配等递归 SQL段头和位图块的更改、将数据块标记为 unrecoverable
等仍然会产生少量日志。
2. Hint 的不正确写法。
这是一个比较不容易发现的问题。下面几条 SQL,哪一条 SQL append hint 会生效:
view plain copy to clipboard print ?
1. INSERT /*+ append,parallel(t1) */ INTO T1 SELECT * FROM T2;
2. INSERT /*+ parallel(t1), append */ INTO T1 SELECT * FROM T2;
3. INSERT /*+ this is append */ INTO T1 SELECT * FROM T2;
4. INSERT /*+ this append */ INTO T1 SELECT * FROM T2;
要回答这个问题,请先看下面的测试(测试环境:10.2.0.1 for Windows):
view plain copy to clipboard print ?
SQL> INSERT /*+ append,parallel(t1) */ INTO T1 SELECT * FROM T2;
已创建 55640 行。
统计信息
----------------------------------------------------------
12304 redo size
SQL> COMMIT;
SQL> INSERT /*+ parallel(t1), append */ INTO T1 SELECT * FROM T2;
已创建 55640 行。
统计信息
----------------------------------------------------------
5739584 redo size
SQL> COMMIT;
SQL> INSERT /*+ this is append */ INTO T1 SELECT * FROM T2;
已创建 55640 行。
统计信息
----------------------------------------------------------
5746604 redo size
SQL> COMMIT;
SQL> INSERT /*+ this append */ INTO T1 SELECT * FROM T2;
已创建 55640 行。
统计信息
----------------------------------------------------------
of 10
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜