2012-03-23 1 views
1

テーブルtbl_Revenueから最低収入を見つける必要がありました。私は何をする二つの方法を発見した:"Min in Select文"または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の資金提供の精度に問題はありますか? (正確には、DMinを使用する前に知っておく必要がある抜け穴があることを意味します)。

答えて

1

特定のコードでは、一度だけ実行しているので違いはありません。それがループまたはクエリの中にあり、数百または数千回の反復を組み合わせている場合は、問題が発生します。

反復の数千人を超えるパフォーマンスが重要な場合、私は次のような何か書きます:MinRev2の一部を置き換え、DAOクエリのために同じことを実装する次に

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 

を。それらを数回実行して平均を取る。実行される条件をシミュレートするために最善の方法を試してください。たとえば、各クエリ内のパラメータを変更する場合は、両方のメソッドのパフォーマンスに影響を与える可能性が高いため、同じ操作を行います。私はAccessでDAOやADOに類似したことをしていて、私の状況ではDAOがより速く走っていたことを知って驚いた(これは数年前のことだったので、

外部テーブルから最小値を取得するためにクエリでDMinを使用することには、明らかに違いがあります。アクセスのドキュメントから:

ヒント:あなたは外国人のテーブルのフィールドからの最小値 を見つけるために、DMIN関数を使用することもできますが、あなたのフィールドを含む クエリを作成する方が効率的両方のテーブルから必要があり、 は、そのクエリのフォームまたはレポートの基になります。

ただし、これはVBAメソッドから両方を実行している状況とは少し異なります。

私は、ドメイン機能(DMin、DMaxなど)がSQLを使用するよりも遅いと信じる傾向がありました(私には何の証拠もないので間違いかもしれません)。おそらく上記のコードを実行すると、それがどのように判明したか教えてください。

DMinコールを正しく書き込むと、わかっている精度の問題はありません。そこにあると聞いたことがありますか?基本的には、電話は:DMin("<Field Name>", "<Table Name>", "<Where Clause>")

幸運です!

2

私は、あなたの状況によって答えが異なる可能性があると考えています。
単一のユーザ状況では、@ transistor1のテスト方法は、分離された検索のための良い答えを提供します。

しかし、ネットワーク上で共有されますデシベルで、すでにSet db = CurrentDb IFそれは遅いですデシベル、2番目の接続を開く必要がないので、その後、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を使用しています。また、内部でCurrentDBオブジェクトを使用するのではなく、DMinが別の接続を開いていることをどのように知っていますか? – transistor1

+2

*いくつかのケースでは、CurrentDbを使用すると正しく動作しないことがありました。特にそれを何度も参照したときには特に役に立ちました。しかし、率直に言って、詳細を覚えていません。私はそこに例があると思う:http://social.msdn.microsoft.com/Forums/en-US/accessdev/thread/7ea9506f-5e91-4896-80b9-6712762388ea/ –

+2

+1非常に興味深い、リンクのおかげで+1。私はその特定の問題がなぜうまくいかず、OpenRecordset()を使ってそれを踏んだのかと疑問に思いました。私はCurrentDb()をオブジェクトとして考える傾向があることを認めなければなりませんが、私はそれが(IntelliSenseを介して)メソッドであることを知っていました。私は常に、CurrentDb()が毎回同じ参照を返すと誤って推測していました。 – transistor1

関連する問題