2012-03-23 99 views
1

我需要從表tbl_Revenue中找到最低收入。我發現了兩種方法來做到這一點:「選擇語句中的最小值」或DMin()。哪一個更好?

方法1

Dim MinRevenueSQL As String 
Dim rsMinRev As DAO.Recordset 
MinRevenueSQL = "SELECT Min(tbl_Revenue.Revenue_Value)As MinRevenue FROM tbl_Revenue WHERE (((tbl_Revenue.Division_ID)=20) AND ((tbl_Revenue.Period_Type)='Annual'));" 
Set rsMinRev = CurrentDb.OpenRecordset(MinRevenueSQL) 
MinRev = rsMinRev!MinRevenue 

方法2

MinRev2 = DMin("Revenue_Value", "tbl_Revenue", "(((tbl_Revenue.Division_ID)=20) AND ((tbl_Revenue.Period_Type)='Annual'))") 

我有以下問題:

  1. 它們中的哪一個是計算上更高效?如果不是tbl_Revenue表有一個使用聯接的選擇語句,那麼計算效率是否有很大差異?
  2. DMin fundtion的準確性有問題嗎? (我的意思是說,在使用DMin之前我需要知道的任何漏洞)。

回答

1

在您的特定代碼中,您正在運行一次,所以它沒有太大區別。如果它處於循環或查詢中,並且您將數百或數千次迭代結合在一起,那麼您將遇到問題。

如果超過數千次迭代的性能對你很重要,我會寫類似如下:

Sub runDMin() 
    x = Timer 

    For i = 1 To 10000 
     MinRev2 = DMin("Revenue_Value", "tbl_Revenue", "(((tbl_Revenue.Division_ID)=20) AND ((tbl_Revenue.Period_Type)='Annual'))") 
    Next 

    Debug.Print "Total runtime seconds:" & Timer - x 
End Sub 

然後實現了DAO查詢相同,更換MinRev2部分。兩次運行它們並取平均值。盡力模擬它將運行的條件;例如,如果您要更改每個查詢中的參數,請執行相同操作,因爲這很可能會影響兩種方法的性能。我在Access中使用DAO和ADO做了類似的事情,並且很驚訝地發現,在我的情況下,DAO運行速度更快(這是幾年前,所以可能事情發生了變化)。

當在查詢中使用DMin從外部表中獲取最小值時,肯定會有差異。在訪問文檔:

提示:儘管您可以在外部表使用DMIN函數來查找最小值 從一個領域,它可能是更有效地創建一個 查詢包含字段,你需要來自兩個表格,並且 基於您的表單或報告。

但是,這與您在VBA方法中運行的情況稍有不同。

我傾向於相信(也許錯誤,因爲我沒有任何證據)域功能(DMin,DMax等)比使用SQL慢。也許如果你運行上面的代碼,你可以讓我們知道它的結果。

如果您正確寫入DMin調用,那麼我沒有發現準確性問題。你有沒有聽說過?基本上,該電話應該是:DMin("<Field Name>", "<Table Name>", "<Where Clause>")

祝你好運!

2

我懷疑答案可能因您的情況而異。
在單個用戶的情況下,@晶體管1測試方法將爲您提供單獨查找的良好答案。

但在這是一個網絡上共享一個數據庫,IF你已經Set db = CurrentDb,則SELECT方法應該會更快,因爲它不需要打開的分貝,這是一個緩慢的第二個連接。

同樣的,Set db = CurrentDb效率更高,並且隨處可用。
在我想確保自己的速度最快的情況下,我在打開應用程序時使用了Public db as DAO.Database。然後在需要的每個模塊中,我使用
If db is Nothing Then set db = CurrentDb

+0

只是好奇 - 爲什麼無論你使用Set db = CurrentDb還是隻是在任何地方使用CurrentDb對象(除非你需要靈活地將其改爲CodeDB或其他東西)? OP使用CurrentDB。另外你怎麼知道DMin​​打開一個單獨的連接,而不是內部使用CurrentDB對象? – transistor1 2012-03-23 16:47:10

+2

在某些情況下,我經歷過使用CurrentDb無法正常工作,特別是當您多次提及它時 - 但坦率地說,我不清楚這些細節。我認爲這裏有一個例子:http://social.msdn.microsoft.com/Forums/en-US/accessdev/thread/7ea9506f-5e91-4896-80b9-6712762388ea/ – 2012-03-23 16:58:00

+2

+1非常有趣,感謝您的鏈接。我想知道爲什麼這個特定的問題沒有起作用,並且使用OpenRecordset()對它進行了側面調整。我必須承認我傾向於將CurrentDb()看作是一個對象,儘管我確實知道它是一種方法(通過IntelliSense)。我總是錯誤地認爲CurrentDb()每次都返回相同的引用。 – transistor1 2012-03-23 17:21:26

相關問題