database - Oracle 查询优化器的诊断输出

标签 database oracle performance query-optimization

在许多情况下,我们对 Oracle 基于成本的优化器就查询执行计划做出的决策并不满意。使用提示、不太直接的查询转换、索引重组和实例参数,我们然后尝试诱导它做我们认为更有意义的事情。这在很大程度上是在黑暗中进行尝试,并且开发、暂存和生产服务器之间的结果可能差异很大(无论我们多么努力地尝试同步统计数据等)。

有没有办法从 Oracle 服务器获取诊断输出,以说明 CBO 研究了哪些备选方案,以及它们为何被丢弃?

我正在考虑像 EXPLAIN PLAN 这样的功能,除了它会枚举所有可能的(或至少很多)执行计划及其相关成本。

最佳答案

通过收集 10053 跟踪事件转储,您可以更好地了解 Oracle 优化器如何做出决策。

我发现优化器很少做出“错误”的决定(好吧,不包括跨数据库链接的分布式查询),但通常会被不能准确表示数据的性质和分布的统计信息所误导。查看 http://optimizermagic.blogspot.com 等资源和 http://www.jlcomp.demon.co.uk查看优化器内部结构。

您还可以使用 Oracle SQL Analyzer 实用程序(额外费用)让优化器考虑替代路径,如果找到更好的路径,它至少会生成新旧 EXPLAIN PLANS 供您比较。有时您可以根据此信息对次优计划的原因进行逆向工程(并且您会更经常地发现这是一个统计问题)

关于database - Oracle 查询优化器的诊断输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1124368/

相关文章:

ios - Swift 乱序执行 firebase 调用

android - 如何在不更改主键的情况下执行 SQL Insert 或 Replace like operator?

linux - Linux inotify API 的效率如何?

SQL、Postgres OID,它们是什么以及它们为什么有用?

swift 4 : Are Strings reference counted & how to get that count

mysql - 如何在具有多个值的不同数据库中的两个表/不同列之间移动数据

mysql - 性能问题 MySQL 5.7

oracle - 安装Oracle 11g后如何登录scot账号

sql - 返回每组一列最大值的行

c# - 如何使用 Oracle 日期格式将 DateTime 转换为 C# 中的字符串