performance - 如何在没有提示的情况下增加哈希连接、分组依据和排序依据的 Oracle CBO 成本估算

标签 performance oracle oracle10g optimization cbo

在我们拥有的某些服务器上,哈希连接、分组依据和排序依据的成本与实际成本相比似乎太低了。 IE。通常,带有索引范围扫描的执行计划优于前者,但在解释计划中,成本显示得更高。

一些进一步的说明:

  1. 我已经将 optimizer_index_cost_adj 设置为 20,但仍然不够好。我不想增加纯全表扫描的成本,事实上我不介意优化器降低成本。
  2. 我注意到pga_aggregate_target会对 CBO 成本估算产生影响,但我绝对不想降低此参数,因为我们有足够的 RAM。
  3. 与在单个查询中使用优化器提示相反,我希望设置是全局的。
<小时/>

编辑 1:我正在考虑尝试动态采样,但我没有足够的深入知识来预测这将如何影响整体性能,即执行计划更改的频率。我肯定更喜欢非常稳定的东西,事实上,对于我们的一些最大的客户,我们有锁定所有统计数据的政策(这将随着 Oracle 11g SQL 计划管理而改变)。

最佳答案

通常,当使用索引范围扫描的执行计划优于使用完整扫描+排序或散列连接的执行计划时,但 CBO 会选择完整扫描,这是因为优化器相信它会找到比实际情况更多的匹配结果生活。

换句话来说,如果优化器认为要从A表中获取1M行,从B表中获取1000行,那么它很可能会选择全扫描+排序合并或散列连接;然而,如果当它实际运行查询时,它只从表 A 中获取 1 行,那么索引范围扫描可能会更好。

我首先查看一些性能不佳的查询并分析谓词的选择性,确定优化器是否对每个表的行数进行了合理的估计。

编辑: 您提到基数估计是不正确的。这是你问题的根本原因;哈希连接和排序的成本可能相当不错。在某些情况下,优化器可能会使用错误的估计,因为它不知道数据的相关程度。某些列上的直方图可能会有所帮助(如果您还没有获得它们),并且在某些情况下,您可以创建基于函数的索引并收集隐藏列的统计信息,以便为优化器提供更好的数据。

最终,您很可能需要在查询中指定各个表的基数的技巧才能获得令人满意的性能。

关于performance - 如何在没有提示的情况下增加哈希连接、分组依据和排序依据的 Oracle CBO 成本估算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1123219/

相关文章:

oracle - 使用通信驱动程序测试引擎测试 Siebel 通信驱动程序

java - 为什么通过 stream() 调用比使用 if 子句更耗时?

performance - JavaFX2 - 将定制 (fxml) 面板动态添加到 gridpane 时性能非常差

sql - 使用 SQL 或 PL/SQL 对多个表中的列和表名进行动态查询

stored-procedures - 通过调度程序作业将参数传递给oracle存储过程

performance - 如何将 Oracle 用户配置文件投入实际使用?

php - 非法变量名称/编号

tsql - IN或OR哪个更快?

java - JList搜索效率

oracle - 获取查询的运行时执行计划