Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据标准估计行的快速方法_Sql_Sql Server 2005 - Fatal编程技术网

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
      
      • SELECT
        语句包装到CTE(公共表表达式)中
      • 在该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分钟运行一次并不会经常影响服务器。是的,表可能会变得非常大。我忘了提那件事了!谢谢在数据世界中,“巨大”不是一个很有用的形容词。这完全与每个人的经历有关。