論理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に電話するか、チームに今すぐメールを送信してください。