sql—运行查询时,虽然返回的数据或记录很少,但会花费太多时间?

vfh0ocws  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(402)

我在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)

但还是要花太多时间
那么,我该怎么做来增强查询,使时间最少化呢?

dfddblmv

dfddblmv1#

在应用筛选之前,您正在读取大量行。你可以改变主意 joins 订购和使用 force the join order 但最好简化查询。你能试试这个吗?

CREATE TABLE #Buffer
(
    [PartID] BIGINT PRIMARY KEY-- or the type it is
)

INSERT INTO #Buffer ([PartID])
SELECT DISTINCT pt.PartID
FROM Parts.Nop_Part pt WITH(NOLOCK) 
INNER JOIN Parts.Nop_PartsFamilyAttribute fmat WITH(NOLOCK) 
    ON  fmat.PartFamilyID=pt.PartsFamilyID 
    AND fmat.[Key]=20281007;

SELECT fmat.Value as PLID
      ,c.CodeTypeId
      ,COUNT(DISTINCT tr.PartID) [#partsHasCodes]
into #partsHasCodes
FROM Parts.TradeCodes tr WITH(NOLOCK) 
INNER JOIN #Buffer pt WITH(NOLOCK) 
    ON pt.PartID = tr.PartID
inner join #TempPlAndCodeType c 
    on c.CodeTypeId = tr.CodeTypeID
GROUP BY fmat.Value
        ,c.CodeTypeId;

这个想法是通过 Parts.Nop_PartsFamilyAttribute 先把table拿出来 partid s。然后,提取数据。您可以从下面的屏幕截图中看到,您开始读取5000万行,并分配~700MB内存。然后,经过 Parts.Nop_PartsFamilyAttribute 桌上,我们只有1400万。

相关问题