
正如您在上面的屏幕截图中所看到的,这个查询提供了一个并行插入:
INSERT INTO #StateAllocationData WITH (TABLOCK)
(ProjectID,StateId,StateLineDescriptionId,PartnerID,Value)
SELECT @ProjectID as ProjectID,sld.StateId,sld.ID,TaxReturnPartnerNumber,0 as Value
FROM Meta.States S(NOLOCK)
LEFT JOIN Meta.StateAllocationLineDescriptions SLD(NOLOCK) ON S.StateId = SLD.StateId
join Ottp.PartnerData PD on ProjectID=@Projectid
WHERE SLD.isDeleted = 0 AND SLD.ID IS NOT NULL 
但是,正如您在上面的屏幕截图中所看到的,这个查询不执行并行插入,我想知道为什么:
INSERT INTO #SAmt WITH (TABLOCK) (ProjectID,StateId,K1SummaryID,StateLineDescriptionId)
SELECT @ProjectID AS 'ProjectID',
S.StateId,
SLD.StateLineDescriptionId AS 'K1SummaryID',
SLD.ID AS 'StateLineDescriptionId'
FROM Meta.States S(NOLOCK)
LEFT JOIN Meta.StateAllocationLineDescriptions SLD(NOLOCK) ON S.StateId = SLD.StateId
WHERE --SLD.isK1Summary <> 0 and
SLD.isDeleted = 0
AND SLD.ID IS NOT NULL 发布于 2022-07-28 08:56:11
显然,查询是不一样的。在第一个查询中,您试图使用.@ProjectID,在第二个查询中没有。
试着使用
SET STATISTICS TIME ON
GO
--query 1
GO
--query 2
GO
SET STATISTICS TIME OFF
GO比较第一次和第二次查询的CPU时间和经过的时间。
有时,Server决定不使用并行插入来使用更少的资源(例如,更少的cpu时间),而查询最终会变得更慢(占用的时间更长)。
如果您拥有Server 2016或更高版本,则可以尝试使用以下非文档查询提示,以查看在每个查询结束时通过OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))并行执行是否更快。请注意,像这样的无文档化的特性只应该在非生产环境中使用,并且只用于测试目的,除非您愿意承担将来在没有通知的情况下更改特性的风险,这可能会破坏您的代码。
例如:
INSERT INTO #SAmt WITH (TABLOCK)
(
ProjectID,
StateId,
K1SummaryID,
StateLineDescriptionId
)
SELECT @ProjectID AS 'ProjectID',
S.StateId,
SLD.StateLineDescriptionId AS 'K1SummaryID',
SLD.ID AS 'StateLineDescriptionId'
FROM Meta.States S (NOLOCK)
LEFT JOIN Meta.StateAllocationLineDescriptions SLD (NOLOCK)
ON S.StateId = SLD.StateId
WHERE --SLD.isK1Summary <> 0 and
SLD.isDeleted = 0
AND SLD.ID IS NOT NULL
OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'));https://dba.stackexchange.com/questions/314959
复制相似问题