2011-12-01 123 views
2

MAIN_TABLE中有超過1億條記錄; SECURITY_TABLE中有超過2.5億條記錄。我試圖從MAIN_TABLE中檢索符合過濾條件的對象,並且當前用戶也可以訪問(訪問記錄存儲在security_table中)。我使用類似以下內容進行查詢:短語SQL語句

01 select col1, col2, col3 from main_table 
02 where (col4 like '%something%' 
03 or col4 like '%something else%' 
04 or col4 like "%some other thing%') 
05 AND 
06 col1 in (select st_col1 from security_table 
07 where st_id in (
08  select col1 from main_table 
09  where (col4 like '%something%' 
10  or col4 like '%something else%' 
11  or col4 like "%some other thing%' 
12  ) 
13 ) 
14 AND 
15 st_user_id = current_user_id 
16) 

如果我必須在線路過濾標準2-4(標準A)五場比賽,將過濾條件在9-11行(標準B)重新掃描MAIN_TABLE中的全部1億條記錄,或僅包含2-4行返回的5條記錄?

回答

2

它取決於很多東西的™,包括您的RDBMS(SQL Server,Oracle,MySQL等)。

但是,其中大多數的答案是maybe?

例如,SQL Server可能會檢查第二個條件,如果查詢分析器根據索引和基數確定它會更快。他們也可能很可能被並行檢查,並且在哈希表中比較兩個檢查的內容以找到交集。

對於您的特定情況,查詢的性質需要進行表掃描,因此無關緊要。

+0

+1 RDBMS將決定如何應用您的子句。 – Matthew

0

您的條件:

OR LIKE '% ... %' 

將需要掃描,並且每增加一個類似OR標準的額外掃描。

在第05行後追加AND子句時,可以從前一個條件返回的集合中完成。 但是您無法控制SQL Server首先會使用哪種標準。它會嘗試自行優化。

檢查您的查詢計劃是否真的在做什麼。

0

這將重新掃描整個表 - 內子查詢與主查詢完全獨立的,即使它是做同樣的事情(因此似乎是完全多餘的 - 如果你在內部有不同標準子查詢,它不會是多餘的)。

+0

我添加內部子查詢的唯一原因是,如果用戶可以訪問大量對象(例如,安全表中的行數),我會將比較減少到只有那些符合過濾標準。如果這些表格在1000年的記錄中,我不會在意,但是數百萬?這是一個完整的'無球賽'。 –