SQLServer query blocking itself,如何解决?

问题描述 投票:0回答:1

我有这个问题

;WITH --first CTE is your data set example
    CTE
    AS
    (
        SELECT *
        FROM (VALUES
                ('2023-04-06', 0029, 'D', 'ABCD', 1, 100),
                ('2023-04-06', 0027, 'D', 'ABCD', 1, 200),
                ('2023-04-06', 0044, 'D', 'ABCD', 1, 300),
                ('2023-04-06', 0042, 'D', 'ABCD', 1, 400),
                ('2023-04-06', 0029, 'C', 'ABCD', 1, 500),
                ('2023-04-06', 0069, 'C', 'ABCD', 1, 600),
                ('2023-04-06', 0067, 'C', 'XXCD', 1, 700),
                ('2023-04-06', 0089, 'C', 'ABCD', 1, 800),
                ('2023-04-06', 0079, 'C', 'XXCD', 1, 900),
                ('2023-04-06', 0084, 'C', 'ABCD', 1, 1000)) AS T([BOOKING_DATE],[TIME_INTERVAL],[DB_CR_CODE],[CHANNEL],[NBR_OF_TXN],[AMOUNT])
    ),
    CTE2 --aggregate data 
    AS
    (
        SELECT
            booking_date, interval, product_group1, product_group2,
            SUM(nbr_of_txn) AS nbr_txn, SUM(amount) AS amount
        FROM
            (SELECT
                BOOKING_DATE,
                CASE
             WHEN TIME_INTERVAL BETWEEN 0000 AND 0030 THEN 1
             WHEN TIME_INTERVAL BETWEEN 0031 AND 0060 THEN 2
             WHEN TIME_INTERVAL BETWEEN 0061 AND 0090 THEN 3
             ELSE 99 
         END AS interval,
                CASE
             WHEN DB_CR_CODE = 'C' THEN 'Credit'
             WHEN DB_CR_CODE = 'D' THEN 'Debit'        
             ELSE '' 
         END AS PRODUCT_GROUP1,
                CASE 
             WHEN DB_CR_CODE = 'C' AND CHANNEL = 'ABCD' THEN 'Credit_ABCD'  
             ELSE '' 
         END AS PRODUCT_GROUP2,
                NBR_OF_TXN, AMOUNT
            FROM
                CTE) a
        GROUP BY booking_date, interval, PRODUCT_GROUP1, PRODUCT_GROUP2
    )

    --UNION from CTE2
    SELECT booking_date, interval, product_group1, nbr_txn, amount
    FROM CTE2
    WHERE product_group1 !=''
    UNION ALL
    SELECT booking_date, interval, product_group2, nbr_txn, amount
    FROM CTE2
    WHERE product_group2 !=''

每天它包含 10 到 1500 万条记录。当我运行它一天时,它立即进入暂停状态。我在3.5小时后取消了它

enter image description here

看起来它因为那个 SELECT (STATMAN) 而阻塞了自己。

enter image description here

SELECT(STATMAN) 是什么?为什么这样做,而我只是在阅读。 如何解决这个问题?

希望有人能帮忙。小补充:最后这个查询会被嵌入到一个视图中。

问候 罗恩

使用 SSMS v18.2.1

sql-server sql-server-2012 blocking table-statistics
1个回答
0
投票

SELECT (STATMAN)
是统计更新。如果统计信息需要更新,这通常设置为在您从表中读取时自动发生,但默认情况下会同步发生(即您需要等待)。

您有多种选择:

  • 使用
    SET AUTO_CREATE_STATISTICS OFF
    关闭自动创建统计信息。建议您手动创建自己的统计信息。
  • 使用
    SET AUTO_UPDATE_STATISTICS OFF
    关闭自动统计更新,或对单个统计对象使用
    NO_RECOMPUTE
    。除非您知道自己在做什么,否则这是不可取的,并且您需要有一些过程来手动或按计划更新它们。
  • 设置统计数据异步更新,让你的查询不用等待,使用
    SET AUTO_UPDATE_STATISTICS_ASYNC ON
    。请注意,此选项默认情况下未启用,但通常建议使用。如果您在加载表格后立即查询表格,则此选项可能会有问题。
© www.soinside.com 2019 - 2024. All rights reserved.