强制执行计划在一次情况下使用提示USE_NL仅对所有表执行嵌套循环联接的最佳方法是什么,
在另一种情况下,对所有表仅使用USE_Hash提示执行哈希联接我想运行这两个查询,看看哪一个在执行计划和使用中成本较低,请建议
我的疑问是,我应该把HINT内的所有4张表按哪个顺序排列,如下所示USE_NL(bl1_gain_aj,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
抛开为查询选择最合适的提示(如果有的话)不谈,在USE_NL
提示中写入表名/别名的顺序无关紧要。
根据Oracle文档:
请注意,
USE_NL(table1 table2)
不被视为多表提示因为它是USE_NL(table1)
和USE_NL(table2)
的快捷方式
关于USE_NL,Oracle表示:
USE_NL
提示指示优化器加入每个指定的表使用指定的表作为内部表。
也就是说,如果编写USE_NL(table1 table2 table3 table4)
,这意味着"将所有这些表用作嵌套循环联接中的内部表";如果您的查询只有这4个表,那么对于至少一个表,提示将被忽略:要将一个表用作内部表,我们需要另一个表作为外部表,因此不可能将所有表都用作内部表。
LEADING
在扫描表格的顺序方面做了一些不同的事情:
LEADING提示指示优化器使用指定的表作为执行计划中的前缀。