2014-01-27 23 views
2

我有关于(非)使用唯一索引的问题。我正在使用Oracle 11g。在连接中不使用唯一索引(覆盖3列)

表A: col1,col2,col3。 COL1-COL2-COL3三重峰具有在表A.

表B多列唯一索引: COLX。 COLX是B表的主键

我的查询是:“在TABLE_A每一行读”

SELECT * FROM TABLE_A A 
JOIN TABLE_B B ON A.col1 = B.colX 
WHERE A.col2 = 10 and A.col3 = 20 

当我看着蟾蜍解释计划,我看到(完全访问)。

然而,当我写的查询:

SELECT * FROM TABLE_A A 
WHERE A.col1 = 10 AND A.col2 = 20 AND A.col3 = 30 

它采用了独特的指数。

我也尝试使用IN,但是在IN查询中也没有使用索引。有什么办法在这种连接查询中使用这个唯一索引?如果没有,你能否指点我另一种方法来提高查询的速度?谢谢。

+0

http://en.wikipedia.org/wiki/Database_index#Column_order阅读关于'composite index'。 –

+0

独特的索引定义可以帮助我们帮助你。我猜col2是在col3之前声明的,所以没有col2的查询被强制进入一个表扫描。如果您将更频繁地使用“查询”1,则应考虑对索引列进行重新排序。 – RubberDuck

+1

如果第一列中的第一列与索引中的第一列相匹配,则将使用该索引(一般情况下)。如果您想在第一个查询中使用索引,请创建一个“索引(col2,col3)”。 – Mihai

回答

0

TABLE_A,使一个索引与col1仅与另一个指数(为加入使用)配有col2col3只(以用于过滤谓词)。

查询优化器将JOIN和筛选视为两个单独的操作。它不会使用col1的索引作为过滤操作的第一列。

+0

谢谢丹尼尔,它现在有效。 – yalpertem