SQL查询-访问- Join / in / Exists的改进



这是我的SQL查询-在访问中使用。它提供了期望的结果。但只是想知道这种方法是否正确。怎样才能加快速度呢?

    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
                            )
    ;

中近似的行数"预期结果"——数百万"invdl"- 80000"INVDETAILS"- 300,000 -总数,对于一个日期-大约- 10,000,然后每个日期的每个地区再减少。

请提供一个更好的查询。

你可以研究两件事,这可能有助于加快速度:

索引

确保您已经索引了join、WHERE子句和GROUP BY子句中涉及的所有列。

JOIN表达式包含函数

你的几个join使用Round(ExpectedResult.Total),所以如果你在ExpectedResult.Total上有一个索引,你的查询将无法使用它。你可以得到一个性能提升,如果你添加一个RoundedTotal列(长整数,索引),填充它与

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

,然后在join中使用RoundedTotal列。

相关内容

最新更新