2013-03-25 46 views
0

这是我的SQL查询 - 在Access中使用。它提供了期望的结果。 但只是想通过这种方法是否正确。 这怎么能加速。SQL Query中的改进 - 访问 - 加入/ IN /存在

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” - 80000 “INVDETAILS” - 300000 - 总,一个日期 - 约 - 10,000,然后每日期每个区域又较小。

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

回答

0

两件事情,你可以调查,这可能有助于加快速度吧:

索引

请确保您有索引的所有参与连接,列的WHERE子句和GROUP BY子句。

JOIN涉及功能

表达一对夫妇的您连接使用Round(ExpectedResult.Total),所以如果你有ExpectedResult.Total索引您的查询将无法使用它。如果添加了一个RoundedTotal柱(长整型,索引)你可能会得到一个性能提升,与

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

填充它,然后使用RoundedTotal列在你的连接。

+0

谢谢。第一次选择加入和第二次加入的条件是相同的。那为什么想知道是否应该/可以做什么。 – arcotenterprises 2013-03-25 21:37:09