【问题标题】:Reading the number of rows inserted from another ongoing transaction读取从另一个正在进行的事务中插入的行数
【发布时间】:2012-10-09 18:45:43
【问题描述】:

我有一个类似的交易

BEGIN TRANSACTION

INSERT INTO Table2 WITH(TABLOCK)
   SELECT BLAH 
   FROM Table

COMMIT TRANSACTION

此交易最多可能需要一个小时才能完成。

我想运行一个查询,有点像:

SELECT COUNT(*) FROM Table2

定期在一个完全不同的线程上报告到目前为止已经插入了多少行。

这可能吗?有什么方法可以查询未提交的行数吗?

谢谢

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    在查询中添加 WITH (NOLOCK) 提示。

    SELECT COUNT(*) FROM Table2 WITH (NOLOCK);
    

    在开始事务之前进行基线计数,然后从当前数字中减去该值以获得新插入的行数。

    【讨论】:

    • 不幸的是,这不起作用。尽管主查询运行了 10 分钟,但它返回零。我知道查询工作正常。也许还有其他方法?
    • @Boomerangertanger:不,这是正确的。在这 10 分钟内,您的查询可能没有插入任何内容。如果您从未对查询进行过性能分析,您将无法知道什么时候在做什么。也许它在 SELECT 中花费了 59 分钟,在 INSERT 部分结束时花费了 1 分钟。或者它可能只是闲置在那里被另一个事务阻塞。
    • 好的,很公平。我发现这个简单的存储过程在我的本地机器上需要 10 分钟,而在 SQL Azure 上需要一个多小时才能获得相同数量的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2019-02-12
    • 2021-08-05
    • 1970-01-01
    • 2015-07-15
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多