暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
实战Oracle优化器Hint.pdf
59
10页
10次
2024-12-17
免费下载
美河学习在线 www.eimhe.com
实战 Oracle 优化器 Hint
虽然基于成本的优化器在选择正确的优化路径方面和为系统中成千上万的查询利用
引的方面极其精确,可它也并非尽善尽美。为此,Oracle 可以为制定查询提供具体的提示:
否决优化器的决定,以期获得更佳的查询性能。这也是 Oracle 为什么引入 Hint
Hint Oracle 数据库中很有特色的一个功能,是很多 DBA 优化中经常采用的一个手段。
那为什么 Oracle 会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下
它会选择正确的优化器,减轻 DBA 的负担。但有时它也聪明反被聪明误,选择了很差的执
行计划,使某个语句的执行变得奇慢无比。此时就需要 DBA 进行人为的干预,告诉优化
使用指定的存取路径或连接类型生成执行计划,从而使语句高效地运行。Hint 就是 Oracle
提供的一种机制,用来告诉优化器按照告诉它的方式生成执行计划。
当遇到 SQL 执行计划不好的情况,应优先考虑统计信息等问题,而不是直接加 Hint
事。如果统计信息无误,应该考虑物理结构是否合理,即没有合适的索引。只有在最后仍然
不能 SQL 按优化的执行计划执行时,才考虑 Hint。毕竟使用 Hint,需要应用系统修改代码,
Hint 只能解决一条 SQL 的问题,并且由于数据分布的变化或其他原因(如索引更名)等,会导
SQL 再次出现性能问题。
Hint 是比较"暴力"的一种解决方式,不是很优雅。要开发人员手工修改代码。Hint
会去适应新的变化。比如数据结构、数据规模发生了重大变化,但使用 Hint 的语句是感知
变化并产生更优的执行计划。Hint 随着数据库版本的变化,可能会有一些差异、甚至废弃的
情况。此时,语句本身是无感知的,必须人工测试并修正。
提示是 Oracle 为了不破坏和其他数据库引擎之间对 SQL 语句的兼容性而提供的一种扩
展功能。Oracle 决定把提示作为一种特殊的注释来添加。它的特殊性表现在提示必须紧跟着
DELETEINSERTUPDATE MERGE 关键字。换句话说,提示不能像普通注释那样在 SQL
句中随处添加且在注释分隔符之后的第一个字符必须是加号。在后面的用法部分,会详
说明。
Hint 提供的功能非常丰富,可以很灵活地调整语句的执行过程。通过 Hint我们可以调
整:优化器类型,优化器优化目标,数据读取方式(访问路),查询转换类型,表间关联的
顺序,表间关联的类型,并行特性,其他特性
这节课主要介 Hint 的基本语法和使用方法。
1
和优化器相关的
当对优化器为某个语句所制定的基本执行计划不满意时,最好的办法就是通过提示来转
换优化器的模式并观察其转换后的结果,看是否已经达到期望程度。如果只通过转换优化
器的模式就可以获得非常好的执行计划,则就没有必要额外使用更为复杂的提示了。
ALL_ROWS
为实现查询语句整体最优化而引导优化器制定最少成本的执行计划。这个提示会使优
器选择一条可最快检索所有查询行的路径,而代价就是在检索一行数据时,速度很慢。
FIRST_ROWS
为获得最佳响应时间而引导优化器制定最少成本的执行计划。这个提示会使优化器选
美河学习在线 www.eimhe.com
可最出查的第一行(指定)径,价就是检多行就会
慢。利用 FIRST_ROWS 来优化的行数,默认值为 1,这个值介 10 1000 之间,这个使用
FIRST_ROWS(n)的新方法是完全基于代价的方法。它对 n 很敏感,如果 n 值很小,CBO 就会
生成包含嵌套循环以及索引查找的计划;如果 n 很大,CBO 会生成由哈希连接和全表扫描组
成的计划(类似 ALL_ROWS)
CHOOSE
依据 SQL 中所使用到的表的统计信息存在与否来决定使用 RBO 还是 CBO。在 CHOOSE
模式下,如果能够参考表的统计信息,则将按照 ALL_ROWS 方式执行。除非在查询中的所
表都没有经过分析,否则 choose 提示会对整个查询使用基于代价的优化。如果在多表连
中有一个表经过分析过,那么就会对整个查询进行基于代价的优化。
RULE
使用基于规则的优化器来实现最优化执行,即引导优化器根据优先顺序规则来决定查
条件中所使用到的索引或运算符的执行顺序来制定执行计划。这个提示强制 oracle 优先使用
预定义的一组规则,而不是对数据进行统计;同时该提示还会使这个语句避免使用其他提示
除了 DRIVING_SITE ORDERED(不管是否进行基于规则的优化,这两个提示都可使用)
2
和访问路径相关
FULL
告诉优化器通过全表扫描方式访问数据。这个提示只对所指定的表进行全表扫描,而不
是查询中的所有表。FULL 提示可以改善性能。这主要是因为它改变了查询中的驱动表,而
不是因为全表扫描。在使用其他某些提示时,也必须使用 FULL 提示。只有访问整个表时
才可利用 CACHE 提示将表进行缓存。并行组中的某些提示也必须使用全表扫描。
CLUSTER
引导优化器通过扫描聚簇索引来从索引表中读取数据。
HASH
引导优化器按照哈希扫描的方式从表中读取数据。
INDEX
告诉优化器对指定表通过索引的方式访问数据。当访问数据会导致结果集不完整时,
化器将忽略这 Hint
美河学习在线 www.eimhe.com
NO_INDEX
告诉优化器对指定表不允许使用索引这个提示会禁止优化器使用指定索引可以在删
除不必要的索引之前在许多查询中禁止索引。如果使用了 NO_INDEX但是没有指定任何
引,则会执行全表扫描。如果对某个索引同时使用 NO_INDEX 和会之产生冲突的提示(
INDEX),这时两个提示都会被忽略掉。
INDEX_ASC
利用索引从表中读取数据时,引导优化器对提示中所指定索引的索引列值按照升序使
范围扫描。
INDEX_COMBINE
告诉优化器强制选择位图索引。这个提示会使优化器合并表上的多个位图索引,而不是
选择其中最好的索引(这是 INDEX 提示的用途)还可以使用 index_combine 指定单个索引(
于指定位图索引该提示优先于 INDEX 提示)对于 B 树索引,可以使用 AND_EQUAL 提示而
不是这个提示。
INDEX_JOIN
索引关联,谓词中引用的列上都有索引的时候,可以通过索引关联的方式来访问数据
这个提示可以将同一个表的各个不同索引进行合并,这样就只需要访问这些索引就可以了
节省了回表查询的时间。但只能在基于代价的优化器中使用该提示。这个提示不仅允许只访
问表上的索引,这样可以扫描更少的代码块,并且它比使用索引并通过 rowid 扫描整个表快
5 倍。
INDEX_DESC
利用索引从表中读取数据时,引导优化器对提示中所指定索引的索引列值按照降序使
范围扫描。
INDEX_FFS
告诉优化器以 INDEX FFS(index fast full scan)的方式访问数据。INDEX_FFS 提示会执行一
索引的快速全局扫描。这个提示只访问索引,而不是对应的表。只有查询需要检索的信息
在索引上时,才使用这个提示。特别在表有很多列时,使用该提示可以极大地改善性能。
INDEX_SS
强制使用 index skip scan 的方式访问索引。当在一个联合索引中,某些谓词条件并不
联合索引的第一列时(或者谓词并不在联合索引的第一列时),可以通 index skip scan 来访
问索引获得数据当联合索引第一列的唯一值很少时,使用这种方式比全表扫描的方式效率
要高。
of 10
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。