Performance

查詢性能問題

  • October 26, 2014

我需要幫助來提高以下查詢的性能。它的目的是從一組具有相同 ID(雙重)的記錄中選擇一個記錄。規則是 Date2 必須是最新的並且 Date1 必須存在:

對於InputTable (= rst(0) )do 中的每個不同的 ID:

INSERT INTO FinalTable(ID, FID, KeyValue1, KeyValue2, Date1) 
SELECT InputTable.ID, 
      InputTable.FID, 
      InputTable.KeyValue1, 
      InputTable.KeyValue2, 
      InputTable.Date1
FROM
 ( SELECT TOP 1 * 
   FROM
     ( SELECT * 
       FROM InputTable 
       WHERE ID='" & rst(0) & "' And Date1<>''
     )
   WHERE Date2 = 
         ( SELECT Max(Date2) 
           FROM InputTable 
           WHERE ID = '" & rst(0) & "' and Date1 <> ''
         )
 );

InputTable 有大約 400.000 條記錄和約 200.000 個不同的 ID,並且僅包含將在 Final Table 中的 5 個欄位,所有這些欄位都是 TEXT。

InputTable 是一個 importet .txt 文件,我在任何真實數據庫之外使用 ACCESS。結果將再次寫入 .txt 文件。

每個ID大概需要1秒左右,太長了……能不能顯著提升性能?

我真的很感激任何幫助。

為每個不同的 ID 值重複執行這些子查詢是要你的命。我在包含 10,000 行的樣本表上對您的方法進行了測試,在我的筆記本上執行大約需要 2.5 分鐘。相比之下,以下程式碼在不到 0.5的時間內始終返回相同的結果:

Option Compare Database
Option Explicit

Sub UsingAggregateQuery()
   Dim cdb As DAO.Database, t0 As Single
   Set cdb = CurrentDb
   cdb.Execute "DELETE FROM FinalTable", dbFailOnError
   t0 = Timer
   cdb.Execute _
           "INSERT INTO FinalTable(ID, FID, KeyValue1, KeyValue2, Date1) " & _
           "SELECT InputTable.ID, " & _
           "       Last(InputTable.FID), " & _
           "       Last(InputTable.KeyValue1), " & _
           "       Last(InputTable.KeyValue2), " & _
           "       Last(InputTable.Date1) " & _
           "FROM " & _
           "    (" & _
           "        SELECT ID, FID, KeyValue1, KeyValue2, Date1 " & _
           "        FROM InputTable " & _
           "        WHERE Date1 <> '' " & _
           "        ORDER BY ID, Date2 " & _
           "    ) " & _
           "GROUP BY ID;", _
           dbFailOnError
   Debug.Print Format(Timer - t0, "0.0") & " seconds"
   Set cdb = Nothing
End Sub

編輯

我剛剛對 400,000 行的範例表進行了另一次測試,上面的程式碼在 7 秒內完成

引用自:https://dba.stackexchange.com/questions/80904