Sql 带OR运算符的列的复合索引
我有两个表,有两个匹配的列c1,c2Sql 带OR运算符的列的复合索引,sql,oracle,Sql,Oracle,我有两个表,有两个匹配的列c1,c2 TABLE_A TABLE_B ======= ======= id id c1 c1 c2 c2 double col_y col_z 在我的查询中,我需要知道每个列c1或c2的记录是否匹配,如: 现在我有一个c1列的索引和一个c2列的索引 为了加快查询速度,我是否可以从列c1和c2创建复合索引,因为我搜索的是c1或c2而不是c1和c2?不可能创建该索引。但您应该将
TABLE_A TABLE_B
======= =======
id id
c1 c1
c2 c2
double col_y
col_z
在我的查询中,我需要知道每个列c1或c2的记录是否匹配,如:
现在我有一个c1列的索引和一个c2列的索引
为了加快查询速度,我是否可以从列c1和c2创建复合索引,因为我搜索的是c1或c2而不是c1和c2?不可能创建该索引。但您应该将查询重写为两个单独的查询
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);
有一篇关于或扩展的好文章是的,你可以创建一个复合索引 当查询通常使用索引中的所有或至少大多数列时,复合索引最有用。如果要检索的数据包含在索引中,它们也会特别有用。例如,在下面的Select语句中:
SELECT c1, c2
FROM sometable
WHERE c1 = somevalue;
如果c1和c2上有单独的索引,Oracle将访问c1的索引,然后使用索引中的记录拉入所需的表块。c2指数根本不会被使用。如果c1和c2上有一个复合索引,那么优化器几乎肯定会扫描该索引,并使用索引块返回数据,而不会触及表
复合索引中的列越多,扫描成本就越高。如果针对该表的查询不经常使用索引中的大多数/所有列,则很可能使用的索引少于单个列上相应的单列索引 这里强调的是列not和列之间的OR运算符。如果有和接线员,那么你说的一切都可以。如果我有一个查询,其中c1=sth1和c2=sth2,那么复合索引有帮助,但我们讨论的是c1=sth1或c2=sth2,或运算符之间的子句顺序是否重要?我的意思是,如果c2可以更快地找到匹配项,那么最好将其放在第一位吗?这取决于,在某些情况下,这会有所帮助。但数据库应该进行查询转换并找到最快的方法。
SELECT c1, c2
FROM sometable
WHERE c1 = somevalue;