Oracle使用Hint USE_NL USE_HASH加入

时间:2017-01-04 09:17:49

标签: oracle hints

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

我的疑问是我应该在HINT中为所有4个表放入哪个序列,如下所示 USE_NL(bl1_gain_adj,customers,bl1_gain,bl1_reply_code)

SELECT s.*
FROM work_status s 
LEFT JOIN work w
   ON s.work_id = w.id
WHERE s.work_id = 14681 AND
   w.investigation = '1' AND
   w.deleted = '0' AND
   w.investigation_winner = '0' AND
   w.investigation_validated = '1' AND
   w.work_denied = '0' AND
  CONVERT(VARCHAR(10), s.date_added, 120) <= DATEADD(WEEK, -2, CONVERT(VARCHAR(10), GETDATE(), 120) AND
  (SELECT MAX(CONVERT(VARCHAR(10), date_added, 120)) FROM work_status) <= DATEADD(WEEK, -2, CONVERT(VARCHAR(10), GETDATE(), 120)
ORDER BY s.date_added DESC
LIMIT 1

2 个答案:

答案 0 :(得分:0)

不考虑为查询选择最合适的提示(如果有的话),在USE_NL提示中编写表名/别名的顺序无关紧要。

根据Oracle documentation

  

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

快捷方式

关于USE_NL,Oracle says

  

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

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

关于扫描表格的顺序,

LEADING做了一些不同的事情:

  

LEADING提示指示优化器使用指定的一组   table作为执行计划中的前缀。

答案 1 :(得分:-2)

Oracle最好选择联接和解释计划。你在这里关心什么?你想要实现什么目标?