SQL查询的改进 - 访问 - 加入/ IN /存在

时间:2013-03-25 07:04:07

标签: sql ms-access

这是我的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
                            )
    ;

大约的行数 “预期结果” - 数百万 “INVDL” - 80,000 “INVDETAILS” - 300,000 - 总计,一个日期 - 大约10,000,然后每个区域每个日期再次减少。

如果可能,请提供更好的查询。

1 个答案:

答案 0 :(得分:0)

您可以调查的两件事可能有助于加快速度:

<强>索引

确保已索引JOIN,WHERE子句和GROUP BY子句中涉及的所有列。

JOIN涉及函数的表达式

您的几个JOIN使用Round(ExpectedResult.Total),因此如果您在ExpectedResult.Total上有索引,则您的查询将无法使用它。如果添加RoundedTotal列(长整数,已建立索引),则可以提高性能,并使用

填充它
UPDATE [ExpectedResult] SET [RoundedTotal]=Round([Total])

然后使用JOIN中的RoundedTotal列。