Sql 根据标准估计行的快速方法
我看到一些帖子详细介绍了在不使用Sql 根据标准估计行的快速方法,sql,sql-server-2005,Sql,Sql Server 2005,我看到一些帖子详细介绍了在不使用COUNT(*)的情况下“估计”给定SQL表中的行数的快速方法。但是,如果需要估计满足给定条件的行数,那么它们似乎都不能真正解决问题。我试图找到一种方法来估计满足给定条件的行数,但是这些条件的信息分散在两个或三个表中。当然,SELECT COUNT(*)和NOLOCK提示以及一些连接就可以了,我可以低估或高估总记录。问题是,这种查询大约每5-10分钟运行一次,因为我不需要实际的数字,只需要一个估计值——我想在速度上权衡准确性 解决方案(如果有的话)可能是特定于“S
COUNT(*)
的情况下“估计”给定SQL表中的行数的快速方法。但是,如果需要估计满足给定条件的行数,那么它们似乎都不能真正解决问题。我试图找到一种方法来估计满足给定条件的行数,但是这些条件的信息分散在两个或三个表中。当然,SELECT COUNT(*)
和NOLOCK
提示以及一些连接就可以了,我可以低估或高估总记录。问题是,这种查询大约每5-10分钟运行一次,因为我不需要实际的数字,只需要一个估计值——我想在速度上权衡准确性
解决方案(如果有的话)可能是特定于“SQL Server”的。事实上,它必须与SQLServer2005兼容。有什么提示吗?可能的解决方案:
- 如果计数与表中的总行数相比较大,那么添加包含
条件的索引将有帮助,并且查询速度将非常快where
- 如果结果数接近表中的总行数,索引将不会有多大帮助。您可以实现一个触发器来维护“条件计数表”。因此,每当添加行匹配条件时,您都会增加表中的值,而当删除行时,您会减少该值。因此,您将查询这个小的“汇总计数表”
- 要做到这一点,没有简单的方法。您可以获得表中总行数的估计值,例如,从系统目录视图
但是对于WHERE子句中给定的一组标准,没有办法做到这一点——要么你必须为每一组标准和值保留计数,要么你必须使用黑魔法来找出答案。SQL Server保存的唯一一个地方就是它保存的索引统计数据。这些将有关于什么类型的值在索引中出现的频率的特定信息-但我真的不知道您是否(以及如何)在自己的查询中利用统计信息
如果您确实必须知道与某个条件匹配的行数,则需要进行某种类型的计数—从dbo.YourTable WHERE(yourcriteria)中选择count(*)
其他东西可能是这样的:
;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
- 将
语句包装到CTE(公共表表达式)中SELECT
- 在该CTE中定义一个
,按某列(或一组列)对数据进行排序行编号()
- 向该CTE添加第二个
,该CTE按同一列(或多列)对数据进行排序,但方向相反(行编号()
与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
;以您的数据作为
(
选择(所需列的列表),
(ORDER BY)上方的行号()为“RowNum”,
(按描述排序)上方的行号()为“RowNum2”
从…起
dbo.YourTable
哪里
)
选择*
从你的数据
这样做,您将获得以下效果:
- 结果集中的第一行将包含常用的数据列
- 第一个
将包含值1行编号()
- 第二个
将包含与该标准集匹配的行总数行编号()
它在处理中小型结果集方面出人意料地出色——我还没有尝试过如何处理真正大型的结果集——但它可能需要进行调查,看看它是否有效。表格是否庞大?每5-10分钟运行一次并不会经常影响服务器。是的,表可能会变得非常大。我忘了提那件事了!谢谢在数据世界中,“巨大”不是一个很有用的形容词。这完全与每个人的经历有关。