我有两个表,有两个匹配的列(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)吗?
答案 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;
如果您在c1
和c2
上有单独的索引,Oracle将访问c1
的索引,然后使用索引中的记录来提取所需的表块。根本不会使用c2
索引。如果c1
和c2
上有复合索引,那么优化器几乎肯定会扫描索引并使用索引块返回数据 - 从不触及表。
复合索引中的列越多,扫描的成本就越高。如果针对该表的查询不经常使用索引中的大多数/所有列,则可能会使用少于单个列上的相应单列索引。