我有查询,我正在搜索一系列用户帐户,但每次我通过查询我将使用多个ID号的前5位数,并根据我将搜索。我想知道当我们使用10个以上的userID进行搜索时,有没有其他方法可以为用户ID范围重新编写此查询?查询中的这种搜索是否会有巨大的性能损失?
select A.col1,B.col2,B.col3
from table1 A,table2 B
where A.col2=B.col2
and (B.col_id like '12345%'
OR B.col_id like '47474%'
OR B.col_id like '59598%');
我正在使用Oracle11g。
答案 0 :(得分:1)
通常使用LIKE使Oracle无法使用索引。
如果要重用查询,请考虑使用COL_ID的前5个字符创建合成列。在其上放置一个非唯一索引。将搜索关键字放在表格中并将其加入该列。
可能有一种方法可以在前5个字符上使用功能索引。
答案 1 :(得分:1)
实际上,您将传递给查询的用户ID数量并不重要。最重要的部分是查询的选择性。换句话说:您的查询将返回多少行以及表中有多少行。如果返回的行数相对较小,则最好在列B.col_id
上创建索引。使用OR
条件也没什么不好的。基本上每个OR
会在执行计划中添加一个INDEX RANGE SCAN
,最后CONCATENATION
(但您更愿意检查您的实际计划)。如果所有操作的总成本低于完整表扫描,那么Oracle CBO将使用您的索引。在其他情况下,如果您一次选择> = 20-30%的数据,则最有可能发生全表扫描,您甚至不必担心OR
,因为将读取所有数据并将每个值与您的多个条件不会增加太多开销。
答案 2 :(得分:0)
我不知道表现是否会更好,但另一种写作方式是联盟:
select A.col1,B.col2,B.col3
from table1 A,table2 B
where A.col2=B.col2
and (A.col_id like '12345%')
union all
select A.col1,B.col2,B.col3
from table1 A,table2 B
where A.col2=B.col2
and (A.col_id like '47474%') -- you did mean A.col_id again, right?
union all
select A.col1,B.col2,B.col3
from table1 A,table2 B
where A.col2=B.col2
and (A.col_id like '59598%'); -- and A.col_id here too?