2013-04-15 66 views
0

尋求加快此查詢的建議。 Access 2007. 內部查詢需要幾分鐘時間,完整查詢需要很長時間(40 - 80分鐘)。結果如預期。一切都被索引。SQL Query中的改進 - 複雜加入/ IN/Exists

SELECT qtdetails.F5, qtdetails.F16, ExpectedResult.DLID, ExpectedResult.NumRows 
FROM qtdetails 
INNER JOIN (INVDL 
      INNER JOIN ExpectedResult 
        ON INVDL.DLID = ExpectedResult.DLID) 
     ON (qtdetails.F1 = INVDL.RegionCode) 
      AND (qtdetails.RoundTotal = ExpectedResult.RoundTotal) 
WHERE 
     (qtdetails.F5 IN (SELECT qtdetails.F5 
          FROM (ExpectedResult 
            INNER JOIN INVDL 
              ON ExpectedResult.DLID = INVDL.DLID) 
          INNER JOIN qtdetails 
            ON (INVDL.RegionCode = qtdetails.F1) 
             AND (ExpectedResult.RoundTotal = qtdetails.RoundTotal) 

          GROUP BY qtdetails.F5 
          HAVING (((COUNT(ExpectedResult.DLID)) < 2)); 
          ) 
     ); 

INVDL - 80000個記錄

ExpectedResult - 百個千萬記錄

qtDetails - 12000個記錄

內部查詢將導致大約5000 - 8000條記錄。 嘗試在表中保存內部查詢的結果。然後使用 改爲從qTempTable中選擇F5。但仍需要很長時間。

任何幫助將非常感激。

數據類型:

qtdetails.F5 = Number 
qtdetails.F16 = Text 
ExpectedResult.NumRows = Number 
INVDL.DLID = Number 
ExpectedResult.DLID = Number 
INVDL.RegionCode = Text 
qtdetails.F1 = Text 
+0

爲了得到這種性質的任何實際幫助,建議還要提供'EXPLAIN'計劃(這基本上是所有RDBMS如何決定如何查找東西的)。至少要知道你有什麼指數。 '很長'要多久?如果你的_expected result_是10mil行,它會**需要一段時間。 –

+0

@ Clockwork-Muse我已經索引了連接中涉及的所有列。想知道如果轉換「IN」加入會有所幫助。是的「ExpectedResult」會很大,它的預期。使用Access - EXPLAIN可以在這裏使用? – arcotenterprises

+0

你可以在這裏提供更多的信息嗎? 3個表格中每列的數據類型是什麼?他們如何映射到對方(1對1,1對多等)?樣本數據的一小部分也會很有用,以查看一切如何結合在一起。 – John

回答

0

重建上查詢中涉及的所有表索引。再次運行查詢並檢查時間。這會減少執行時間。如果可以的話,我會很快更新你的調諧查詢。

繼續查詢!

+0

您能否提供一個簡單的代碼來重建VBA中現有表上的索引。 – arcotenterprises

+0

重建索引的語法 - 「ALTER INDEX REBUILD;」。您可以選擇像這樣的索引 - 從user_indexes中選擇index_name,其中table_name位於('table1','table2'); – vivek