强制执行计划在一次使用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
答案 0 :(得分:0)
不考虑为查询选择最合适的提示(如果有的话),在USE_NL
提示中编写表名/别名的顺序无关紧要。
请注意,
的快捷方式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最好选择联接和解释计划。你在这里关心什么?你想要实现什么目标?