具有OR运算符的列的复合索引

时间:2017-05-17 08:16:02

标签: sql oracle

我有两个表,有两个匹配的列(c1,c2);

TABLE_A    TABLE_B
=======    =======
id         id
c1         c1
c2         c2
double     col_y
           col_z

在我的查询中,我需要知道记录是否按列c1 OR c2匹配,如:

UPDATE table_a a SET double='Y'
 WHERE EXISTS (SELECT * 
                 FROM table_b b 
                WHERE a.c1=b.c1 OR a.c2=b.c2);

现在我有一个列c1的索引和一个列c2的索引。

为了加快查询速度,我可以从列c1和c2创建复合索引,因为我搜索c1或c2(不是c1和c2)吗?

2 个答案:

答案 0 :(得分:1)

无法创建该索引。但是您应该将查询重写为两个单独的查询。

UPDATE table_a a SET double='Y'
 WHERE EXISTS (SELECT 1
                 FROM table_b b 
                WHERE a.c1=b.c1                
                  union all 
                SELECT 1
                 FROM table_b b 
                WHERE a.c2=b.c2);

有关于“或扩展”的好文章or expansion

答案 1 :(得分:1)

是的,你可以创建复合索引.. !!

当查询通常使用索引中的所有(或至少大多数)列时,复合索引最有用。如果要检索的数据包含在索引中,它们也特别有用。例如,在下面的Select Statement:

SELECT c1, c2
FROM   sometable
WHERE  c1 = somevalue;

如果您在c1c2上有单独的索引,Oracle将访问c1的索引,然后使用索引中的记录来提取所需的表块。根本不会使用c2索引。如果c1c2上有复合索引,那么优化器几乎肯定会扫描索引并使用索引块返回数据 - 从不触及表。

复合索引中的列越多,扫描的成本就越高。如果针对该表的查询不经常使用索引中的大多数/所有列,则可能会使用少于单个列上的相应单列索引。