怎么是SQL Profile

77次阅读
没有评论

共计 2467 个字符,预计需要花费 7 分钟才能阅读完成。

本篇内容主要讲解“怎么是 SQL Profile”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“怎么是 SQL Profile”吧!

SQL Profile 是什么

SQL Profile 是我非常喜欢的一个技术,通过它可以在不修改 SQL 语句的情况下,为 SQL 绑定任何需要的 hint,与 SQL 代码是分离的,而且相对 Baseline、outline 来说,操作步骤简单,如果使用熟练可以在极短的时间内修正一个查询语句的执行计划,我已经在多个场合使用 SQL Profile 解决了数据库的性能问题。SQL Profile 是 ORACLE 10G 出现的一个功能,SQL Profile 在 Oracle 文档中被描述为作为 SQL Tuning Advisor 的一部分,只能通过 SQL Tuning Advisor 来使用,一般是通过运行 SQL Tuning Advisor 的 JOB,JOB 运行结束后可以查看 SQL Tuning Advisor 给出的优化建议,这些建议里可能会包含让 DBA 采用 SQL Profile(hint 的集合),作为 ORACLE 10G 后提供的新功能,DBA 可以将 SQL 调优的工作交给 SQL Tuning Advisor 来做。正常情况下,一个 SQL 语句交给 SQL 优化器后,优化器需要在非常短的时间内,给出解析结果,但是 SQL Tuning Advisor 却不同,它为了产生一个高效的执行计划,可能会花费很长的时间。进一步讲,它还会使用一些非常耗时的技术如 Wath-If 分析,并加强对动态采样技术的利用来核实优化器的估计值。SQL Tuning Advisor 的任务是分析 SQL 语句并建议如何使用一些方法来提高语句的性能,包括收集遗漏或过时的对象统计信息,创建新索引,改变 SQL 语句或者采用 SQL Profile。按照官方的说法,SQL Profile 只能通过 SQL Tuning Advisor 来使用,但是本节后面的几个章节都会使用手工创建 SQL Profile 的方式来告诉读者如何更快速的使用、创建 SQL Profile,但是手工创建 SQL Profile 并不被 ORACLE 技术支持所支持。

简单来说 SQL Profile 是一个对象,包含了一系列的 hint,这些 hint 包含了可以帮助优化器为一个特定的 SQL 语句找到高效执行计划的额外信息。这些 hint 包含执行环境,对象统计信息,和对查询优化器所作评估的修正信息,例如广为流传的 OPT_ESTIMATE 就是由 SQL Profile 所引入的 hint,它主要的作用是设定对象统计信息、放大或缩小优化器的评估基数、修正表连接的基数,例如,select * from a where status= Inactive,真实的返回基数为 10000,但是由于统计信息的陈旧,导致优化器认为只返回 100,因此通过 OPT_ESTIMATE 会纠正这一信息,例如通过 OPT_ESTIMATE(@ SEL$1 , TABLE, A @ SEL$1 , SCALE_ROWS=100) 来告诉优化器,对于表 A 经过谓词过滤后返回的基数为:优化器的评估基数再放大 100 倍,也就是优化器评估基数 100,再乘以放大系数 100,最终的基数为 10000(注意 OPT_ESTIMATE 等 hint 的纠正信息并不会存储、更新到表、索引等对象的统计信息里)。从这里我们也可以看出,SQL Profile 并不是真正的锁定执行计划,而只是告诉优化器一些更加真实的信息,让优化器根据真实的信息来得到更加合理的执行计划。因此,即使一个 SQL 使用了 SQL Profile,优化器在选择执行计划的时候也具有很大的灵活性,随着数据的变化,时间的推移,这些修正因子可能也已经不再准确,因此可能会出现在某些使用了 SQL Profile 的 SQL, 刚开始这些 SQL Profile 工作的很好,但是不久就会产生一些问题。不过 SQL Profile 跟 outline、Baseline 一样都是基于存储一些 hint 来发挥作用的,SQL Profile 虽然默认不会使用例如 index、full 等我们常见的 hint,但是这些 hint 依然可以在 SQL Profile 里发挥作用。

SQL Profile 在 10G 和 11G 默认是被打开的,可以通过设置参数 SQLTUNE_CATEGORY 为 false 来关闭 SQL Profile。每个 SQL Profile 都被放置在一个特定的 category 中,可以在创建 SQL Profile 时指定 category 的值,如果不指定会被放在 SQLTUNE_CATEGORY 为 defualt 的 category 中。如果 SQLTUNE_CATEGORY 的值被设置为非 default 的值,那么只有 SQL Profile 的 category 的值为参数 SQLTUNE_CATEGORY 设置值的才会生效。

n Note:SQL Profile 可以为 SQL 语句添加任何 hint,例如:bind_aware 这个 hint 并不能通过 SQL Baseline 起作用,但是可以通过 SQL Profile 起作用。因为 SQL Profile 作为一种基于 hint 修正 SQL 执行计划的机制,做的比较傻瓜化,它仅仅是把 hint 应用到特定签名的 SQL 上,不会做其他校验,SQL Baseline 不仅仅只是应用 hint,还需要做 plan_hash_value 值的计算校验, 因此对于 bind_aware 这种 hint 并不能对 SQL Baseline 起作用,因为这个 hint 会导致执行计划的不稳定性,而 Baseline 创建的时候是跟具体的 plan_hash_value 挂钩的,不能与这种具有不稳定性的 hint 挂钩。

n SQL Profile 可以在 DataGuard 中使用,也就是说在主库创建 SQL Profile 后,备库可以自动使用到在主库上创建的 SQL Profile,但是 Baseline 不能在 DataGuard 中使用。

到此,相信大家对“怎么是 SQL Profile”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-24发表,共计2467字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)