正如您在上面的屏幕截图中看到的,此查询提供了并行插入:
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
查询显然不一样。在第一个查询中,您尝试通过内部连接过滤... @ProjectID,在第二个查询中您没有。
尝试使用
比较第一次和第二次查询的 CPU 时间和经过的时间。
有时 SQL Server 决定不使用并行插入来使用更少的资源(例如,更少的 cpu 时间)并且查询最终会变慢(经过的时间更长)。
OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))
如果您有 SQL Server 2016 或更高版本,您可以尝试使用以下未记录的查询提示,通过在每个查询结束时查看并行执行是否更快。请注意,此类未记录的功能应仅在非生产环境中使用并且仅用于测试目的,除非您愿意承担将来功能更改而不另行通知的风险,这可能会破坏您的代码。例如: