【发布时间】: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 评估多个计划并始终采用成本最低的计划 - 除非您使用提示覆盖。
-
为什么要使用嵌套循环?这是拥有数百万行的最昂贵的方式
-
过去的经验表明,当您开始想向查询添加提示时,就会出现其他问题。这可能是表格设计、统计数据、对数据配置文件的误解等。提示是一种能很快引起更多麻烦的创可贴。如果这些表中的数据配置文件发生变化,那么您的提示可能会强制执行不合适的计划。