【问题标题】:Azure synapse analytics parallel insert into staging tableAzure 突触分析并行插入临时表
【发布时间】:2021-12-13 02:00:27
【问题描述】:

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

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

存储过程是从 OPENJSON 查询(​​包含 json 的表位于复制的突触表上)到暂存 HEAP 突触表的 INSERT INTO 语句。

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

这是一个锁定问题吗?是他们在查询上要改变的东西,以便同时进行多个插入。

这是循环内的存储过程:

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

【问题讨论】:

  • 在考虑专用 SQL 池的性能和并行性时,您还需要考虑正在运行的 DWU 以及分配给它的资源类。或者您正在使用工作负载分类?请将以上信息添加到您的帖子中。
  • @wBob 我在上面添加了请求的信息;)
  • 您能分享您的 INSERT 语句吗?我认为最好的方法是摆脱 for 循环并将其更改为解析所有 JSON 行的单个插入语句。这应该会大大提高性能并消除(据我所知)单个目标表的锁定。
  • @GregGalloway 我添加了 ISERT INTO 存储的程序;我试图将所有 json 文件直接连接到一个 sql 变量,但这会导致错误,因为它超过 2GB。
  • 而不是FROM OPENJSON 尝试FROM staging.xml_to_json CROSS APPLY OPENJSON(json_file)... 这有意义吗?并在一次插入中加载所有文件路径

标签: azure performance load azure-synapse


【解决方案1】:

最好的方法是去掉 ADF 中的 for 循环,并将其更改为解析所有 JSON 行的单个插入语句。这应该会极大地提高性能并消除对单个目标表的锁定。我相信锁定是基本的障碍。但在 Synapse 中,大型插入的性能也优于数千个小型插入。

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

【讨论】:

    【解决方案2】:

    所以按照the documentation DWU 500 有 20 个并发查询,20 个并发槽,更大的 c 需要 4 个槽。因此,您可以预期的最大并发数为 5,并且不包括正在运行的任何其他查询。

    我建议降低资源类或尝试静态资源类。您也可以尝试提高 DWU,但显然这更昂贵。试验你的工作量,看看什么效果最好。奇怪的是,您一次只运行一个查询 - 检查您的 For Each 活动是否以顺序模式运行,并使用 DMV (sys.dm_pdw_exec_requests) 检查其他正在执行和排队的查询。

    【讨论】:

      猜你喜欢
      • 2020-11-02
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 2015-11-30
      • 2019-05-23
      相关资源
      最近更新 更多