这是我的SQL查询-在访问中使用。它提供了期望的结果。但只是想知道这种方法是否正确。怎样才能加快速度呢?
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"- 80000"INVDETAILS"- 300,000 -总数,对于一个日期-大约- 10,000,然后每个日期的每个地区再减少。
请提供一个更好的查询。
你可以研究两件事,这可能有助于加快速度:
索引
确保您已经索引了join、WHERE子句和GROUP BY子句中涉及的所有列。
JOIN表达式包含函数
你的几个join使用Round(ExpectedResult.Total)
,所以如果你在ExpectedResult.Total
上有一个索引,你的查询将无法使用它。你可以得到一个性能提升,如果你添加一个RoundedTotal
列(长整数,索引),填充它与
UPDATE [ExpectedResult] SET [RoundedTotal]=Round([Total])
,然后在join中使用RoundedTotal
列。