簡體   English   中英

如何提高這類查詢的性能?

[英]how to improve the performance on this type of Query?

我有查詢,我正在搜索一系列的用戶帳戶,但每次我通過查詢我將使用多個身份證號碼的前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。

通常,使用LIKE使Oracle無法使用索引。

如果要重用查詢,請考慮使用COL_ID的前5個字符創建合成列。 在其上放置一個非唯一索引。 將搜索鍵放在表中並將其加入該列。

可能有一種方法可以在前5個字符上使用功能索引。

實際上,您將傳遞給查詢的UserID數量並不重要。 最重要的部分是查詢的選擇性。 換句話說:您的查詢將返回多少行以及表中有多少行。 如果返回的行數相對較小,那么最好在列B.col_id上創建索引。 使用OR條件也沒什么不好。 基本上每個OR將在執行計划中添加一個INDEX RANGE SCAN並進行最終的CONCATENATION (但您更願意檢查您的實際計划)。 如果所有操作的總成本低於完整表掃描,那么Oracle CBO將使用您的索引。 在其他情況下,如果您一次選擇> = 20-30%的數據,則最有可能發生全表掃描,您甚至不必擔心OR因為將讀取所有數據並將每個值與您的多個條件進行比較'增加很多開銷。

我不知道性能是否會更好,但另一種寫作方式是使用union:

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?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM