SQL查询的改进 - 复杂的Join / IN / Exists

时间:2013-04-15 14:51:31

标签: sql performance ms-access access-vba

寻找有关加快此查询的建议。访问2007。 内部查询需要几分钟,完整查询需要很长时间(40 - 80分钟)。结果如预期。一切都是索引。

SELECT qtdetails.F5, qtdetails.F16, ExpectedResult.DLID, ExpectedResult.NumRows
FROM qtdetails 
INNER JOIN (INVDL 
            INNER JOIN ExpectedResult 
                    ON INVDL.DLID = ExpectedResult.DLID) 
        ON (qtdetails.F1 = INVDL.RegionCode) 
           AND (qtdetails.RoundTotal = ExpectedResult.RoundTotal)
WHERE 
      (qtdetails.F5 IN (SELECT qtdetails.F5 
                            FROM (ExpectedResult 
                                  INNER JOIN INVDL 
                                          ON ExpectedResult.DLID = INVDL.DLID)
                            INNER JOIN qtdetails 
                                    ON (INVDL.RegionCode = qtdetails.F1) 
                                       AND (ExpectedResult.RoundTotal = qtdetails.RoundTotal)

                            GROUP BY qtdetails.F5 
                            HAVING (((COUNT(ExpectedResult.DLID)) < 2));
                            )
          );

INVDL - 80,000条记录

ExpectedResult - 一千万条记录

qtDetails - 12,000条记录

内部查询将产生大约5000 - 8000条记录。 尝试在表中保存内部查询的结果。然后使用 从qTempTable中选择F5。但是还是要花很多时间。

非常感谢任何帮助。

数据类型:

qtdetails.F5 = Number
qtdetails.F16 = Text
ExpectedResult.NumRows = Number
INVDL.DLID = Number
ExpectedResult.DLID = Number
INVDL.RegionCode = Text
qtdetails.F1 = Text

1 个答案:

答案 0 :(得分:0)

重建查询中涉及的所有表的索引。再次运行查询并检查时间。它会减少执行时间。如果可以,我会尽快通过调优查询为您更新。

继续查询!