这是我的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,然后每个区域每个日期再次减少。
如果可能,请提供更好的查询。
答案 0 :(得分:0)
您可以调查的两件事可能有助于加快速度:
<强>索引强>
确保已索引JOIN,WHERE子句和GROUP BY子句中涉及的所有列。
JOIN涉及函数的表达式
您的几个JOIN使用Round(ExpectedResult.Total)
,因此如果您在ExpectedResult.Total
上有索引,则您的查询将无法使用它。如果添加RoundedTotal
列(长整数,已建立索引),则可以提高性能,并使用
UPDATE [ExpectedResult] SET [RoundedTotal]=Round([Total])
然后使用JOIN中的RoundedTotal
列。