【问题标题】:Azure SQL trigger processing on 5 million rows500 万行的 Azure SQL 触发器处理
【发布时间】:2021-04-25 11:28:20
【问题描述】:

我正在将遥测数据发送到由不同列组成的 SQL 表,其中一列接收一个实际上是 json 数组的 varchar,例如:

'[{"data1": 5,"data2": 12, "data3": 2},{"data1": 7,"data2": 8, "data3": 1},{"data1": 4,"data2": 2, "data3": 11}]'

这个数组的长度可以改变,但数组的每个元素都是由所有三个键/值组成的。

我想将此数据集成到一个专用表中,其列是: (LandingTableID, Data1, Data2, Data3)

我已经在我的登陆表的每个插入上开发了一个触发器来执行此操作,它工作正常。但是,我正在寻找最佳解决方案来整合我的登陆表中已有的 500 万行。 在这里进行的最佳方式是什么?

由于我使用的是 Azure SQL,我不能使用 SQL 代理(但我可以使用 Azure 函数)。

【问题讨论】:

    标签: tsql triggers azure-sql-database


    【解决方案1】:

    根据 Conor 的建议,您可以调整您的触发器代码,将 JSON 分解为将 500 万行分解为临时表。使用 SELECT INTO 即时创建临时表 (#),并使用 IDENTITY 函数向临时表添加行标识符。如果您认为有必要,这将允许您将最终的 INSERT 批处理到主表中。

    然后INSERT 来自临时表的记录现在是记录格式,而不是 JSON,直接进入您的主表。这应该只需要几秒钟,具体取决于正在运行的其他进程、数据库设置的层等。这样,您可以将 JSON 分解为两个不同的操作,从而减少每个操作的负载,并利用tempdb 用于临时存储。像这样的:

    -- Take the historical JSON and shred it into a temp table as records
    SELECT
        IDENTITY( INT, 1, 1 ) AS rowId,
        t.rowId originalRowId,
        j.[key],
        JSON_VALUE ( j.[value], '$.data1' ) AS [data1],
        JSON_VALUE ( j.[value], '$.data2' ) AS [data2],
        JSON_VALUE ( j.[value], '$.data3' ) AS [data3]
    INTO #tmp
    FROM yourLandingTable t
        CROSS APPLY OPENJSON ( yourJSON ) j
    
    
    -- Now insert the records into the main table in batches
    INSERT INTO yourMainTable ( data1, data2, data3 )
    SELECT data1, data2, data3
    FROM #tmp
    WHERE rowId Between 1 And 1000000
    
    
    INSERT INTO yourMainTable ( data1, data2, data3 )
    SELECT data1, data2, data3
    FROM #tmp
    WHERE rowId Between 1 And 2000000
    
    etc ...
    
    INSERT INTO yourMainTable ( data1, data2, data3 )
    SELECT data1, data2, data3
    FROM #tmp
    WHERE rowId > 5000000
    

    【讨论】:

      【解决方案2】:

      我可能会将其设计为将 Data Lake 作为数据的着陆区,然后使用 Azure 函数进行一些处理,例如将 JSON 转换为表格格式,然后将最终加载到您的 SQL 表中。

      您可以使用数据工厂进行编排

      触发器上的那些数据量可能会遇到性能问题。

      【讨论】:

        【解决方案3】:

        您可以使用 OPENJSON 来破解 JSON 数组并将其转换为行。此文档页面中有一个示例显示了您可以使用的模式:

        https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql?view=sql-server-ver15

        【讨论】:

        • 是的,我很清楚 SQL 的处理方式,问题更多是关于如何处理 500 万条历史记录行(大约相当于 2 个月),而对日常摄取
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-11
        • 1970-01-01
        • 2020-05-07
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 1970-01-01
        相关资源
        最近更新 更多