Azure 突触分析并行插入暂存 table

Azure synapse analytics parallel insert into staging table

我正在使用具有 500 DWU 的专用 SQL 池突触。 ADF 运行ning 在分配给较大组的工作负载分类器下,具有 above_normal 重要性:

我在 ADF foreach 循环中有一个存储过程,foreach 循环中的活动 运行 并行(并行最多 20 个批次计数)。

存储过程是从 OPENJSON 查询(​​包含 json 的 table 在复制突触 table 上)到暂存 HEAP 突触 [=30] 的 INSERT INTO 语句=].

问题是当我查询动态视图以监视突触上的查询 运行 时,我看到一次只有一个 INSERT 语句 运行s,所有其他语句都被挂起。

这是锁的问题吗?他们在查询中需要更改以同时进行多个插入吗?

这是循环内的存储过程:

CREATE PROC [staging].[usp_stg_load_SrcChroniquesPGA] @file_name 
[varchar](100) AS
BEGIN

DECLARE @json nvarchar(max) = (select json_file from [staging]. 
[xml_to_json] where [file_name] = @file_name) ;

INSERT INTO [staging].[SrcChroniquesPGA]
select 
            @file_name as [NomFichier]
            ,[DatePublication],[NomSource],[Pas],[Type],[DateChronique]
            ,CASE WHEN Pas = 'H' AND DATEPART(hh, DateChronique) BETWEEN 0 AND 5 THEN DATEADD(day, -1, CAST(DateChronique AS DATE)) 
                    ELSE CAST(DateChronique AS DATE) END 
             AS [DateJourneeGaziere]
            ,[HorodateMaj],[Qualite]
            ,[ValeurChronique],[DateStatut],[HorodateMajStatut],[ValeurStatut]
    from OPENJSON( @json ,'$') 
    WITH (
        [DatePublication] [datetime2](7) '$.Transaction.HorodateInfos',
        [PGA] nvarchar(MAX) '$.PGA' as JSON
    ) j
    CROSS APPLY OPENJSON(PGA)
    WITH (
        [NomSource] [nvarchar](256) '$.PCEIdentification.NomSource',
        [PGAStatut] nvarchar(MAX) '$.PGAStatut' as JSON,
        [PGAChronique] nvarchar(MAX) '$.PGAChronique' as JSON
    )
    CROSS APPLY OPENJSON(PGAChronique)
    WITH (
        [Pas] [nvarchar](256) '$.Pas',
        [Type] [nvarchar](256) '$.Type',
        --[Unite] nvarchar(100) '$.Unite',
        [Mesure]  nvarchar(MAX) '$.Mesure' as JSON
    ) 
    CROSS APPLY OPENJSON([Mesure])
    WITH (
        [DateChronique] [datetime2](7) '$.Date',
        [ValeurChronique] [float] '$.Valeur',
        [HorodateMaj] [datetime2](7) '$.HorodateMaj',
        [Qualite] [nvarchar](256) '$.Qualite'
    ) msr
    
    OUTER APPLY (
            SELECT * FROM OPENJSON(PGAStatut)
            WITH (
                [DateStatut] [datetime2](7) '$.Date',
                [HorodateMajStatut] [datetime2](7) '$.HorodateMaj',
                [ValeurStatut] [nvarchar](256) '$.Valeur'
            )
            WHERE [DateStatut] = [DateChronique]
                
                ) jj

END

因此根据 the documentation DWU 500 有 20 个并发查询,20 个并发槽,largerc 占用 4 个槽。因此,您可以预期的最大并发数是 5,并且不包括任何其他查询 运行.

我建议降低资源 class 或尝试静态资源 class。您也可以尝试提高 DWU,但显然这更昂贵。试验您的工作负载,看看什么最有效。奇怪的是你一次只得到一个查询 运行 - 检查你的 For Each activity 在顺序模式下不是 运行 并使用 DMVs (sys.dm_pdw_exec_requests) 检查对于其他正在执行和排队的查询。

最好的方法是摆脱 ADF 中的 for 循环并将其更改为解析所有 JSON 行的单个插入语句。这应该会极大地提高性能并消除对单个目标的锁定 table。我相信锁定是最基本的障碍。而且在 Synapse 中,大插入比数以千计的小插入表现更好。

我建议您重构 INSERT 语句。而不是 FROM OPENJSON( @json ,'$') 尝试 FROM staging.xml_to_json CROSS APPLY OPENJSON(json_file)... 您应该尝试在一次插入中加载所有文件路径。