1

選択したオプションに基づいて他のユーザーが精巧な SQL クエリを作成できるようにするフロント エンド アプリケーションがあります。この SQL コードは、パススルー クエリとして使用され、フォームの一部として表示されます。

ただし、作成されたパススルー クエリは非常に低速です。Access で実行すると、3 分から 20 分の範囲になります。SQL Server Management Studio 2012 は、同じクエリを 45 秒から 3 分で完了することができます。この時間差を最小限に抑える、またはなくすにはどうすればよいでしょうか?

tldr:

  • SSMS でクエリを実行する時間: 45 秒

  • Access でクエリを実行する時間: 3 分

  • クエリを含む Access フォームを開く時間: 3 分

質問の背後にある構造

クエリは次のように構成されています

SELECT ...
FROM
    (
    SELECT ...
    FROM
        (
        SELECT ... FROM Archive.YearXX
        UNION
        SELECT ... FROM Archive.YearXX
        UNION
        SELECT ... FROM Current.Year16
        )
        LEFT JOIN ReferenceData.Table ON...
    )
WHERE ...
GROUP BY ...
ORDER BY ...

さまざまなオプションを使用して、コード内のほとんどすべてを変更できます。セグメント内でテーブルがプルされる場所、ステートメントでUNION返されるフィールド、 、、および句に含まれるもの。SELECTWHEREGROUP BYORDER BY

すべての SQL Server は同じローカル ロケーションにあり、参照されるテーブルは 20 フィールド x 100,000 行から 30 フィールド x 13,000,000 行までの範囲です。

現在の接続文字列 (実際のデータは編集済み):

ODBC;Driver=SQL Server;Server=[server name];DATABASE=[database];UID=[username];PWD=[password];

QueryDef を作成する VBA コード:

Set qdf = CurrentDb.CreateQueryDef("GeneratedReportData", GenSQL(False))
    qdf.Connect = "ODBC;Driver=SQL Server;Server=[server name];DATABASE=[database];UID=[username];PWD=[password];"
    qdf.ReturnsRecords = True
    qdf.ODBCTimeout = 0

制約

  • 使用している言語またはソフトウェアを変更できません。

  • サブクエリの構造と使用に関してできることはほとんどありません。

4

0 に答える 0