我已经看到一些帖子详细说明了在不使用COUNT(*)
的情况下“估计”给定SQL表中的行数的快速方法。但是,如果您需要估计满足给定条件的行数,它们似乎都没有真正解决问题。我试图找到估计满足给定条件的行数的方法,但这些条件的信息分散在两个或三个表中。当然SELECT COUNT(*)
带有NOLOCK
提示和几个连接就可以了,而且我可以负担得不到总记录的估计不足或过高。探测是这种查询将每5-10分钟左右运行一次,因为我不需要实际的数字 - 只有一个估计值 - 我想在速度上权衡准确性。
解决方案(如果有)可能是“SQL Server”特定的。实际上,它必须与SQL Server 2005兼容。任何提示?
答案 0 :(得分:1)
没有简单的方法可以做到这一点。您可以获得表格中总行数的估算值,例如来自系统目录视图。
但是对于WHERE子句中的一组给定条件,没有办法做到这一点 - 要么你必须为每组标准和值保持计数,要么你必须使用黑魔法来找出它。 SQL Server保留一些可以进入该方向的唯一地方是它在索引上保留的统计信息。那些将在索引中有多少关于什么样的值出现的信息 - 但我真的不知道你是否(以及如何)在你自己的查询中利用统计中的信息......
如果您确实必须知道符合特定条件的行数,则需要进行某种计数 - SELECT COUNT(*) FROM dbo.YourTable WHERE (yourcriteria)
或其他。
其他东西可能是这样的:
SELECT
语句包装到CTE(公用表表达式)ROW_NUMBER()
,按一些列(或一组列)排序您的数据ROW_NUMBER()
,按同一列(或多列)对您的数据进行排序 - 但方向相反(DESC
与ASC
)这样的事情:
;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
条件的索引将有所帮助,查询将非常快。
如果结果编号接近表中的总行数,索引将无济于事。您可以实现一个可以维护“条件计数表”的触发器。因此,每当添加行匹配条件时,您将增加表中的值,并且当删除行时,您将减小该值。因此,您将查询这个小的“摘要计数表”。