【发布时间】: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