0

これは私のSQLクエリです-Accessで使用しています。それは望ましい結果を提供しています。しかし、アプローチが正しいかどうかについて意見を求めただけです。これをどのようにスピードアップできますか。

    SELECT INVDETAILS2.F5
           , INVDETAILS2.F16
           , ExpectedResult.DLID
           , ExpectedResult.NumRows
    FROM INVDETAILS2
   INNER
    JOIN (INVDL INNER JOIN ExpectedResult ON INVDL.DLID =ExpectedResult.DLID)
               ON (INVDETAILS2.F14 = ROUND(ExpectedResult.Total))
               AND (INVDETAILS2.F1 = INVDL.RegionCode)
    WHERE INVDETAILS2.F29 ='2013-03-06'
      AND INVDETAILS2.F5 IN (SELECT INVDETAILS2.F5 
                               FROM (ExpectedResult
                                      INNER JOIN INVDL
                                      ON ExpectedResult.DLID = INVDL.DLID)
                         INNER JOIN INVDETAILS2
                                    ON INVDL.RegionCode = INVDETAILS2.F1
                                    AND round(ExpectedResult.Total)
                                        = INVDETAILS2.F14
                              WHERE INVDETAILS2.F29='2013-03-06'
                              GROUP BY INVDETAILS2.F5 
                              HAVING Count(ExpectedResult.DLID)<2
                            )
    ;

「ExpectedResult」の行のおおよその数-百万の「INVDL」-80,000の「INVDETAILS」-300,000-合計、1つの日付の場合-約-10,000、その後、日付ごとの各地域でさらに少なくなります。

可能であれば、より適切なクエリを提供してください。

4

1 に答える 1

0

あなたが調査できる2つのことは物事をスピードアップするのに役立つかもしれません:

インデックス作成

JOIN、WHERE句、およびGROUPBY句に関連するすべての列にインデックスを付けていることを確認してください。

関数を含むJOIN式

A couple of your JOINs use Round(ExpectedResult.Total), so if you have an index on ExpectedResult.Total your query won't be able to use it. You may get a performance boost if you add a RoundedTotal column (Long Integer, Indexed), populate it with

UPDATE [ExpectedResult] SET [RoundedTotal]=Round([Total])

and then use the RoundedTotal column in your JOINs.

于 2013-03-25T12:47:59.997 に答える