完整提示的区别
我有以下加入
SELECT
*
FROM
table1 t1
JOIN table2 t2 ON t2.col = t1.col
下面的有什么区别?
SELECT /*+ FULL(t1) */
*
FROM
table1 t1
JOIN table2 t2 ON t2.col = t1.col
SELECT /*+ FULL(t1) FULL(t2) */
*
FROM
table1 t1
JOIN table2 t2 ON t2.col = t1.col
回答
在第一个查询中,您只是暗示 Oracle 应该对 table 执行完整扫描T1。如果T1既小又T2大,优化器仍可能决定T2通过嵌套循环连接中的索引进行访问。
在第二个查询中,您暗示 Oracle 应该对 BOTH 表执行完整扫描。因此,即使T1小而T2大,您的提示也可能会导致优化器全面扫描两个表并使用散列连接将它们连接起来。
......而且,这可能会更慢。这是您通常不想用提示做的事情的一个示例——您不想告诉优化器如何完成它的工作。如果你没有从优化器中得到你想要的,最好从给优化器更多信息的提示开始(例如,/*+ CARDINALITY (nnnn) */或/*+ DYNAMIC_SAMPLING(4) */)