按标准估算行的快速方法

时间:2011-06-18 19:43:29

标签: sql sql-server-2005

我已经看到一些帖子详细说明了在不使用COUNT(*)的情况下“估计”给定SQL表中的行数的快速方法。但是,如果您需要估计满足给定条件的行数,它们似乎都没有真正解决问题。我试图找到估计满足给定条件的行数的方法,但这些条件的信息分散在两个或三个表中。当然SELECT COUNT(*)带有NOLOCK提示和几个连接就可以了,而且我可以负担得不到总记录的估计不足或过高。探测是这种查询将每5-10分钟左右运行一次,因为我不需要实际的数字 - 只有一个估计值 - 我想在速度上权衡准确性。

解决方案(如果有)可能是“SQL Server”特定的。实际上,它必须与SQL Server 2005兼容。任何提示?

2 个答案:

答案 0 :(得分:1)

没有简单的方法可以做到这一点。您可以获得表格中总行数的估算值,例如来自系统目录视图。

但是对于WHERE子句中的一组给定条件,没有办法做到这一点 - 要么你必须为每组标准和值保持计数,要么你必须使用黑魔法来找出它。 SQL Server保留一些可以进入该方向的唯一地方是它在索引上保留的统计信息。那些将在索引中有多少关于什么样的值出现的信息 - 但我真的不知道你是否(以及如何)在你自己的查询中利用统计中的信息......

如果您确实必须知道符合特定条件的行数,则需要进行某种计数 - SELECT COUNT(*) FROM dbo.YourTable WHERE (yourcriteria)或其他。

其他东西可能是这样的:

  • 将您的SELECT语句包装到CTE(公用表表达式)
  • 在该CTE中定义ROW_NUMBER(),按一些列(或一组列)排序您的数据
  • 向该CTE添加第二个ROW_NUMBER(),按同一列(或多列)对您的数据进行排序 - 但方向相反(DESCASC

这样的事情:

;WITH YourDataCTE AS
(
   SELECT (list of columns you need),
      ROW_NUMBER() OVER(ORDER BY <your column>) AS 'RowNum',
      ROW_NUMBER() OVER(ORDER BY <your column> DESC) AS 'RowNum2'
   FROM
      dbo.YourTable
   WHERE
      <your conditions here>
)
SELECT * 
FROM YourDataCTE

这样做会产生以下效果:

  • 结果集中的第一行将包含您常用的数据列
  • 第一个ROW_NUMBER()将包含值1
  • 第二个ROW_NUMBER()将包含与该条件集匹配的行总数

它在处理中小型结果集方面出奇的好 - 我还没有尝试过它如何能够支持非常大的结果集 - 但它可能需要调查并查看它是否有效。

答案 1 :(得分:0)

可能的解决方案:

  • 如果计数值与表中的总行数相比较大,那么添加涵盖where条件的索引将有所帮助,查询将非常快。

    < / LI>
  • 如果结果编号接近表中的总行数,索引将无济于事。您可以实现一个可以维护“条件计数表”的触发器。因此,每当添加行匹配条件时,您将增加表中的值,并且当删除行时,您将减小该值。因此,您将查询这个小的“摘要计数表”。