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 - 总计,对于一个日期 - 大约 - 10,000,然后每个日期的每个区域再次减少。

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

4

1 回答 1

0

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

索引

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

JOIN 涉及函数的表达式

您的一些 JOIN 使用Round(ExpectedResult.Total),因此如果您ExpectedResult.Total的查询中有索引,则将无法使用它。如果您添加一RoundedTotal列(长整数,索引),您可能会获得性能提升,填充它

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

然后RoundedTotal在您的 JOIN 中使用该列。

于 2013-03-25T12:47:59.997 回答