Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 带OR运算符的列的复合索引_Sql_Oracle - Fatal编程技术网

Sql 带OR运算符的列的复合索引

Sql 带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?不可能创建该索引。但您应该将

我有两个表,有两个匹配的列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;