【问题标题】:Oracle join using Hint USE_NL USE_HASHOracle 加入使用提示 USE_NL USE_HASH
【发布时间】:2017-01-04 09:17:49
【问题描述】:

在一次情况下,强制执行计划只对所有使用提示 USE_NL 的表执行嵌套循环连接的最佳方法是什么,
在其他情况下,只对所有表使用 USE_HASH 提示进行哈希连接 我想同时运行查询,看看哪个执行计划和使用成本低,请建议

我的疑问是我应该在 HINT 中的所有 4 个表中按什么顺序排列,如下所示 USE_NL(bl1_gain_adj,customers,bl1_gain,bl1_reply_code)

SELECT bl1_gain_adj.adj_seq_no,
bl1_gain_adj.amount_currency ,
bl1_gain_adj.gain_seq_no, 
customers.loan_key,
customers.customer_key,
FROM
bl1_gain_adj,
customers,
bl1_gain,
bl1_reply_code
WHERE
bl1_gain.loan_key = customers.loan_key
AND bl1_gain.customer_key = customers.customer_key
AND bl1_gain.receiver_customer = customers.customer_no
AND bl1_gain.cycle_seq_no = customers.cycle_seq_no
AND bl1_reply_code.gain_code = bl1_gain.gain_code
AND bl1_reply_code.revenue_code = 'RC'
AND bl1_gain_adj.gain_seq_no = bl1_gain.gain_seq_no
AND bl1_gain_adj.customer_key = bl1_gain.customer_key;

Records in tables
---------------
 bl1_gain_adj = 100 records    
 customers = 10 Million records   
 bl1_gain = 1 Million records   
 bl1_reply_code = 100 million records

【问题讨论】:

  • 我不太清楚。您不能简单地在查询中插入您想要的提示并检查结果计划吗?另外,考虑切换到 ANSI SQL,而不是旧的 Oracle 方式
  • 我的疑问是我应该按照下面的 USE_NL(bl1_gain_adj,customers,bl1_gain,bl1_reply_code)
  • 简单检查执行计划。 Oracle 评估多个计划并始终采用成本最低的计划 - 除非您使用提示覆盖。
  • 为什么要使用嵌套循环?这是拥有数百万行的最昂贵的方式
  • 过去的经验表明,当您开始想向查询添加提示时,就会出现其他问题。这可能是表格设计、统计数据、对数据配置文件的误解等。提示是一种能很快引起更多麻烦的创可贴。如果这些表中的数据配置文件发生变化,那么您的提示可能会强制执行不合适的计划。

标签: oracle hints


【解决方案1】:

除了为您的查询选择最合适的提示(如果有)之外,您在USE_NL 提示中写入表名/别名的顺序并不重要。

根据Oracle documentation

请注意,USE_NL(table1 table2) 不被视为多表提示 因为它是USE_NL(table1)USE_NL(table2)快捷方式

关于USE_NL,Oracle says

USE_NL 提示指示优化器加入每个指定的表 使用指定的嵌套循环连接到另一个行源 table 作为内表。

也就是说,如果你写USE_NL(table1 table2 table3 table4),这意味着“将所有这些表用作嵌套循环连接中的内表”;如果您的查询只有这 4 个表,则至少一个表的提示将被忽略:要将表用作内部,我们需要另一个表用作外部,因此不可能将所有表都用作内部。

LEADING 做了一些不同的事情,关于扫描表的顺序:

LEADING 提示指示优化器使用指定的集合 表作为执行计划中的前缀。

【讨论】:

  • 因此,在具有 4 个表的复杂查询中,如果我使用 USE_NL(table1 table2 table3 table4) 之类的提示,则哪个表将是驱动表,哪个表将是内部表
  • 在这种情况下,Oracle 将尝试将所有这些表用作内部表,假设有一个表可以用作外部表
  • 请再澄清一下,使用/*+ leading (table1 table2 table3 table4 */ with USE_NL(table1 table2 table3 table4) 是否有意义,当我们将多个表格放入Leading hints 时它是如何工作的
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2021-06-22
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多