sql >> データベース >  >> RDS >> Access

クエリ内の式がいつ評価されるかを評価する

    論理SQL処理に関するItzikBen-Ganの優れたグラフは、クエリのパフォーマンスを推論するのに非常に役立ちます。グラフはSQLServer用に作成されていますが、Accessデータベースエンジンを含むSQLStandardに準拠するすべてのデータベースエンジンに適用できます。 SQL Serverデータベースの使用は大好きですが、Accessクエリ(レポート用の一時テーブルなど)の使用を必要とするAccessデータベースまたはAccessアプリケーションがときどきあります。 Accessには派手なパンツのプロファイリングツールが付属していないので、どうすればよいですか?

    独自のトレースユーティリティのジェリーリギング

    それは私に不思議に思いました— SQLクエリの句がいつ実行されるか、そしてどれくらいの頻度で実行されるかを決定することができますか?アクセスには実行計画を表示する手段がありますが、詳細がいつどのように処理されるかについての詳細には入りません。 物理的を推測するための迂回方法があります Accessデータベースエンジンで使用される処理順序:カスタムVBA関数!

    Public Function Trace(EventName As String, Optional Value As Variant) As Boolean
        If IsMissing(Value) Then
            Debug.Print EventName, "#No Value#"
        Else
            Debug.Print EventName, Value
        End If
        Trace = True
    End Function

    これは標準モジュールに保存できます。次に、簡単なテーブルを設定できます:

    Accessクエリの句のトレース

    この設定で、Accessクエリを作成し、Traceを振りかけることができます。 アクセスクエリのさまざまな部分で。 1つの例を次に示します。

    SELECT 
      c1.ColorID, 
      Trace("SELECT") AS Ignored1, 
      Trace("SELECT",c1.Color) AS Ignored2
    FROM tblColor AS c1 
    WHERE Trace("WHERE") <> 0
      AND Trace("WHERE", c1.Color) <> 0
    ORDER BY 
      Trace("ORDER BY"), 
      Trace("ORDER BY", c1.Color);

    次に、データシートビューでクエリを開き、VBIDEの即時ウィンドウに移動すると、次のような出力が表示されます。

    WHERE         #No Value#
    ORDER BY      #No Value#
    SELECT        #No Value#
    WHERE         Red
    ORDER BY      Red
    WHERE         Green
    ORDER BY      Green
    WHERE         Blue
    ORDER BY      Blue
    SELECT        Blue
    SELECT        Green
    SELECT        Red

    これにより、Accessがクエリをどのように解決しているかについての洞察が得られます。これは、パフォーマンスの低いクエリを最適化する必要がある場合に役立ちます。何を学べるか見てみましょう:

    • 列参照がない場合、Accessは結果セット全体に対して1つの値しか持てないことを認識しているため、VBA関数はできるだけ早く呼び出されることがわかります。したがって、関数を何度も呼び出すだけでは意味がありません。同じ答えを得るために。 Trace 2番目のオプションの引数のない呼び出しは、2番目のオプションの引数に列参照を含む他のすべての呼び出しの前に最初に評価されました。
    • 前のポイントの結果として、呼び出しに列参照が含まれている場合は、行ごとに少なくとも1回評価する必要があります。句を評価するときに、各色の値を確認していることがわかります。
    • 順序は、ItzikBen-Ganのグラフに表示されているものとほぼ同じであることがわかります。 WHERE できるだけ早く評価されます、ORDER BY 修飾されていない行をすべて削除した後に評価され、残っているものはすべてSELECT 次に評価されます。
    • 非修飾行を除外した後に並べ替えが適用されることを期待しますが、Accessは、おそらく並べ替えに新しい行を挿入する方が安価であるため、できるだけ早く出力を並べ替えることを好むようです。セット全体の並べ替えを一覧表示します。

    追加の実験と結論

    別のクエリで少し実験することができます。たとえば、AccessがGROUP BYを処理するタイミングと頻度についての洞察を得ることができます。 、次のようなクエリを使用して:

    SELECT 
      c1.ColorID, 
      Trace("SELECT") AS Ignored1
    FROM tblColor AS c1 
    INNER JOIN tblColor AS c2 
      ON c1.ColorID = c2.ColorID
    WHERE Trace("WHERE") <> 0
      AND Trace("WHERE", [c1].[Color]) <> 0
    GROUP BY 
      c1.ColorID,  
      Trace("GROUP BY", c1.Color)
    ORDER BY c1.ColorID;

    次に、これをJetShowPlanと組み合わせて使用​​して、データベースエンジンが実際に実行していることについて詳しく知ることができます。うまくいけば、Accessクエリのパフォーマンスを向上させる方法についての洞察を得るのに役立つかもしれません。課題として、AccessがGROUP BYを実行する理由について考えることができます。 それがする方法。また、データシートを開いてスクロールしてみることをお勧めします。次に、SELECTが見つかります ナビゲートした結果、再評価されます。

    上記の手法は、物理的への洞察を提供することを指摘しておく必要があります。 チャートで説明されている論理的な処理順序ではなく、処理計画。したがって、データ量やクエリごとに計画が異なることを期待する必要があります。 Traceを追加することも考慮する必要があります 機能は計画に影響を与える可能性があります。ただし、これらの考慮事項について非常に懸念している場合は、そのクエリとその基になるデータを、クエリのパフォーマンスを最適化するためのはるかに多くのオプションがあるSQLServerデータベースに移動する方がおそらく良いと思います。

    楽しんでください!

    Microsoft Accessクエリについてサポートが必要ですか?アクセスエキスパート(773)809 5456に電話するか、チームに今すぐメールを送信してください。


    1. Heroku pg:pullがスキーマの入力に失敗する

    2. SQLServerの別のストアドプロシージャでストアドプロシージャを実行する

    3. Oracleでのカンマ区切り値の分割

    4. MySQLダイナミックピボット