- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:定義域集計関数(D~関数))
定義域集計関数(D~関数)のパフォーマンスについて
このQ&Aのポイント
- 定義域集計関数(DAv、DCount、DFirst、DLast、DMax、DMin、Dsum、DLookupなど)を使用すると、対象とするテーブルの全レコードをクライアントに持ってきてから計算や検索を行ないます。
- そのため、基となるテーブルのデータ量が多い場合は、ネットワーク上のトラフィックが増えて、結果が表示されるまでのパフォーマンスが悪くなります。
- レスポンスの向上を図るには定義域関数をストアド等に置き換える必要があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
あくまでも(経験に基づく)私見ですが、書かれている内容は正しいです。それらの関数はSQL Serverで解釈できるようにOLEが変換できないので、ACCESSのあるクライアント側までデータを引っ張ってこないと判断できないです。必然的にトラフィックは増えます。 同じようなことが、リンクテーブルとローカルテーブルのJOINや、クエリ内でテーブルを参照するタイプのACCESSユーザ定義関数を使用するケースなどでもいえます。 Accessももともと閉じたデータベースとして使えるものですし、便利な機能がたくさんありますが、ACCESS外のDBMSで管理するデータを扱う場合はパフォーマンスを考えればデータのある側で処理するに越したことはないでしょう。 ネットワークのトラフィックを減らすためには、書き換える方法は別にストアドプロシージャでなくて通常のクエリでもかまわないので、少なくともデータ抽出に関しては純粋にSQL Serverが解釈できるSQL文を投げて、必要十分な結果だけを受け取るようにすることでしょう。 (具体的にACCESSがどんなSQLをSQL Serverにリクエストしているかを確認するためにSQL Serverプロファイラを活用することをお勧めします) ちなみに突き詰めていくと、すべてのDBアクセスをパラメータ付のストアドプロシージャだけで行うという方向性になると思います。Webアプリなどはこういうアプローチも多いです。
お礼
すいません今頃、回答が来ました。 ------------------------------------------------------------------------------ ご指摘いただいたとおり 「定義域集計関数は対象とするテーブルの全レコードをクライアントにもってきてか ら計算や検索を行ないます・・・トラフィックが増えて、結果が表示されるまでのパ フォーマーンスが悪くなります。」 のくだりは間違っておりました。 誠に申し訳ございませんでした。 記述根拠の出所は大変申し訳ございませんが、諸事情がありお答えできませんが 確認の仕方が足りなくて誤った情報を記載したことを申し訳なく思います。 ------------------------------------------------------------------------------ もう一日までば良かったです、だけど・・・あり得ないことが、あり得るんですね・・・
補足
回答ありがとうございます。 私も本が間違っているとは思えないのですが、実践経験者はD関数でも早いから問題ないよ、ってな感じです。 今朝、100万件のテストデータを作成し試してみました。 キーは1~999999として項目に0と1をセットし1の数をカウントしました。 キーと項目以外に備考と言う名称に「aaaaaaaa」といれてあります。(レコード長を伸ばすため) インデックスは付けてありません。 Msgbox DCount("キー","TEST") Msgbox DCount("キー","TEST","項目=1") を実行したら両方とも0.5秒ほどでした。(10万件も同じ時間) どうも、サーバー側で作業をしているように感じるのでですが、どうなんでしょうか? 私の検証の仕方に問題があるのでしょうか?