如何提高这类查询的性能?

时间:2013-12-30 18:21:36

标签: sql performance oracle11g

我有查询,我正在搜索一系列用户帐户,但每次我通过查询我将使用多个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。

3 个答案:

答案 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?