[英]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.