OPENJSON 从表中解析 3M 行很慢

Posted

技术标签:

【中文标题】OPENJSON 从表中解析 3M 行很慢【英文标题】:OPENJSON is slow to parse 3M rows from a table 【发布时间】:2020-09-17 13:59:38 【问题描述】:

我有一个包含 3M JSON 行的表。

我正在尝试解析 JSON 并将数据插入另一个表。但是 OPENJSON 需要 50 秒来解析 500K 行。

我正在使用的查询


select   
    top 500000
    qse.*
from 
    dbo.QueryStore qs
    cross apply openjson(qs.Query) 
    with
        (

            Col1 nvarchar(max), Col2 nvarchar(max), Col3 nvarchar(max), Col4 nvarchar(max), Col5 nvarchar(max), Col6 nvarchar(max), Col7 nvarchar(max), Col8 nvarchar(max), Col9 nvarchar(max), Col10 nvarchar(max), Col11 nvarchar(max), Col12 nvarchar(max), Col13 nvarchar(max), Col14 nvarchar(max), Col15 nvarchar(max), Col16 nvarchar(max), Col17 nvarchar(max), Col18 nvarchar(max), Col19 nvarchar(max), Col20 nvarchar(max), Col21 nvarchar(max), Col22 nvarchar(max), Col23 nvarchar(max), Col24 nvarchar(max), Col25 nvarchar(max), Col26 nvarchar(max), Col27 nvarchar(max), Col28 nvarchar(max), Col29 nvarchar(max), Col30 nvarchar(max), Col31 nvarchar(max), Col32 nvarchar(max), Col33 nvarchar(max), Col34 nvarchar(max), Col35 nvarchar(max), Col36 nvarchar(max)
        )qse

如何提高 OPENJSON 解析 3M 行的速度?

我们将不胜感激您的帮助和建议。

【问题讨论】:

你测试过indexing the JSON data的效果吗? 是的,仍然需要相同的时间。但是通过在 WITH 子句中分配正确的数据类型 (nvarchar(max)) 来提高性能 【参考方案1】:

您的所有列是否都包含更多 JSON?因为不包含更多 JSON 的字符串列应该是(最大长度)NVARCHAR(4000)。如果该字段包含一个数字,那么它应该给出一个数字 SQL 数据类型(根据需要)而不是 NVARCHAR(MAX)。这应该会减少分配并加快速度。

【讨论】:

是的,我尝试根据数据分配数据类型。而且,是的,性能有所提高。谢谢

以上是关于OPENJSON 从表中解析 3M 行很慢的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server OPENJSON 读取嵌套的 json

使用 OPENJson 向表中插入数据

SQL Server CE性能,从表中选择7000条记录需要8s

使用 OPENJSON 解析

OPENJSON 不会将所有文档都选择到 SQL 表中

无法从表中显示最大工资(测试)