【问题标题】:Getting total number of rows returned by a query获取查询返回的总行数
【发布时间】:2013-12-02 10:48:49
【问题描述】:

哪个选项更快,为什么?

SELECT
    COUNT(1) OVER (PARTITION BY 1), -- Option 1
    ROW_NUMBER() OVER    (    ORDER BY ac.[dateupdated] DESC) AS RowNum,
FROM MyTable ac      
WHERE ac.[idstatus] = @idstatus AND ac.[idtype] = @idtype

SET @TotalRecords = @@ROWCOUNT -- Option 2

这个想法是在 DEV 中,2 个选项之间的差异是 1 秒,但在 PROD 中,两个选项都非常接近 0(0.03 秒)。

【问题讨论】:

  • 我希望@@ROWCOUNT 总是更快,因为它是由任何赋值(包括你的选择)设置的,即使它没有被读取,它是一个存储在服务器内存。如果这是较慢的选择,我会大吃一惊。至于生产中的行为,SQL服务器可以简单地根据各种统计数据决定缓存这个查询的结果是微不足道的,所以它很可能一直返回缓存的结果,更不用说它可以优化查询计划随意。但话又说回来,有什么问题?您只是好奇还是试图解决问题?

标签: sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

在实践中,我发现count over 非常慢,尤其是对于复杂的查询。更不用说您现在可以计算结果集中的每一行了。

如果您动态生成查询,那么首先执行select count(*)(使用所有过滤器等)然后执行您想要的实际选择实际上要快得多。

我不确定您是否可以依赖 @@ROWCOUNT 在所有情况下都是正确的。例如,如果您将分页添加到查询等,它会返回什么?我希望它会返回返回的行数(即页面大小)而不是总数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2022-01-19
    • 2017-02-11
    • 2018-09-20
    • 1970-01-01
    • 2021-01-08
    • 2022-10-07
    相关资源
    最近更新 更多