【问题标题】:Azure SQL Data Warehouse "Impacted RowCount"Azure SQL 数据仓库“受影响的行数”
【发布时间】:2016-08-29 22:29:33
【问题描述】:

在 SQL Azure DB 中执行更新语句时,我们可以通过@@ROWCOUNT 获得受影响的行数,同样在 Azure SQL 数据仓库中我无法获得受影响的行数。有没有办法在 Azure SQL 数据仓库中获取受影响的行数。

【问题讨论】:

    标签: tsql azure azure-sql-database azure-sqldw


    【解决方案1】:

    您可以找到 SQL DW https://azure.microsoft.com/en-us/documentation/articles/sql-data-warehouse-migrate-code/ 的常见解决方法

    @@rowcount 的解决方法是:

    SELECT  SUM(row_count) AS row_count
    FROM    sys.dm_pdw_sql_requests
    WHERE   row_count <> -1
    AND     request_id IN
                        (   SELECT TOP 1    request_id
                            FROM            sys.dm_pdw_exec_requests
                            WHERE           session_id = SESSION_ID()
                            ORDER BY end_time DESC
                        )
    ;
    

    【讨论】:

      【解决方案2】:

      除了上面的正确答案。如果您使用动态 SQL,那么您应该使用“TOP 4”来获取行数。否则,@@rowcount 解决方法将不会返回任何内容。更正:将 subsql 更改为此更正动态 sql 行数问题: 选择前 1 个 request_id FROM sys.dm_pdw_exec_requests WHERE session_id = SESSION_ID() ORDER BY end_time DESC, start_time DESC

      【讨论】:

        【解决方案3】:

        我注意到上述解决方法可能会提供错误的结果,因为它们可能会受到其他请求步骤的影响,即在执行 UPDATE 时,我的一个表具有相关的物化视图,因此 INSERT 操作也作为额外的请求/dm 步骤执行增加行数。

        对于 SELECTS,我还使用下面的修改代码,该代码通常嵌入到带有 @QueryLabel 参数的行计数存储过程中。通常,我总是使用查询标签,在需要行数的查询中,我将@@SPID 添加到标签文本中。这也是因为我不能依赖上面示例中使用的会话 ID,因为大量使用了会产生不同会话 ID 的动态查询/执行。

            -- Use a simple methods for SELECT statements first
            SET @RowCount =
            (
                SELECT
                TOP 1 row_count
                FROM sys.dm_pdw_request_steps
                WHERE row_count >= 0
                AND request_id IN 
                    (
                        SELECT TOP 1 request_id
                        FROM sys.dm_pdw_exec_requests
                        WHERE CHARINDEX(@QueryLabel, [label]) > 0
                        AND operation_type = 'ReturnOperation'
                        ORDER BY end_time DESC -- ok if request has ended
                    )
            )
        

        对于 UPDATE/INSERT/DELETE,我必须查看单独的代码以查看是否有其他谓词与我感兴趣的 DML 的特定请求/dm 操作相关联。但是在执行 UPDATE 时分析各种系统视图/INSERT/DELETE 解决方案似乎与 SELECT 相同,但只是使用了不同的 operation_type。

        所以对于 UPDATE/INSERT/DELETE 来说,似乎可以正常工作的代码(可能需要更多测试)是......

                -- Query which works for UPDATE/INSERT/DELETE
                SET @RowCount =
                (
                    SELECT
                    TOP 1 row_count
                    FROM sys.dm_pdw_request_steps
                    WHERE row_count >= 0
                    AND request_id IN 
                        (
                            SELECT TOP 1 request_id
                            FROM sys.dm_pdw_exec_requests
                            WHERE CHARINDEX(@QueryLabel, [label]) > 0
                            AND operation_type = 'OnOperation'
                            ORDER BY end_time DESC
                        )
                )   
        

        【讨论】:

          猜你喜欢
          • 2016-06-30
          • 1970-01-01
          • 2016-10-26
          • 1970-01-01
          • 2016-02-06
          • 2021-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多