我在SQLServer2012上工作,当运行下面的查询时,我面临一个问题:只需9分钟就可以返回900行
SELECT fmat.Value as PLID,c.CodeTypeId,
COUNT(DISTINCT tr.PartID) [#partsHasCodes]
into #partsHasCodes
FROM Parts.TradeCodes tr WITH(NOLOCK)
INNER JOIN Parts.Nop_Part pt WITH(NOLOCK) ON pt.PartID = tr.PartID
INNER JOIN Parts.Nop_PartsFamilyAttribute fmat WITH(NOLOCK) ON fmat.PartFamilyID=pt.PartsFamilyID AND fmat.[Key]=20281007
inner join #TempPlAndCodeType c on (c.CodeTypeId=tr.CodeTypeID)
GROUP BY fmat.Value,c.CodeTypeId
我尝试过:
这是执行计划:
https://www.brentozar.com/pastetheplan/?id=HJXDEp_bv
将簇索引添加到#tempplandcodetype:
create clustered index idx on #TempPlAndCodeType (CodeTypeId)
但还是要花太多时间
那么,我该怎么做来增强查询,使时间最少化呢?
1条答案
按热度按时间dfddblmv1#
在应用筛选之前,您正在读取大量行。你可以改变主意
joins
订购和使用force the join order
但最好简化查询。你能试试这个吗?这个想法是通过
Parts.Nop_PartsFamilyAttribute
先把table拿出来partid
s。然后,提取数据。您可以从下面的屏幕截图中看到,您开始读取5000万行,并分配~700MB内存。然后,经过Parts.Nop_PartsFamilyAttribute
桌上,我们只有1400万。