Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/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 server 2008 SQL Server中的行数_Sql Server 2008 - Fatal编程技术网

Sql server 2008 SQL Server中的行数

Sql server 2008 SQL Server中的行数,sql-server-2008,Sql Server 2008,如何计算或知道一个表的行数而不扫描所有的表,可能使用行数 将返回行数如果需要精确计数,则需要进行计数*以扫描聚集索引 您可以使用sys.partitions模式获得大致计数,如下所示 更新:要将计数获取到变量中,请执行以下操作: DECLARE @cnt INT; SELECT @cnt = SUM(rows) FROM sys.partitions WHERE index_id IN (0, 1) AND object_id = OBJECT_ID('MyDB.dbo.MyTable'

如何计算或知道一个表的行数而不扫描所有的表,可能使用行数


将返回行数

如果需要精确计数,则需要进行计数*以扫描聚集索引

您可以使用sys.partitions模式获得大致计数,如下所示

更新:要将计数获取到变量中,请执行以下操作:

DECLARE @cnt INT;
SELECT @cnt = SUM(rows)
FROM sys.partitions
WHERE
  index_id IN (0, 1)
  AND object_id = OBJECT_ID('MyDB.dbo.MyTable');
SELECT @cnt;

我相信你不是这个意思,但我会试试看:

select count(*) from table
SQL Server中没有行号,只有Oracle。使用:

SELECT COUNT(primary_key) FROM table
其中主键是表的主键列

因为它是主键,所以它已经被索引了,所以SQL可以在不扫描整个表的情况下对它进行计数。为了精确起见,它使用聚集索引,这比完整表扫描快得多


您也可以使用sys.indexes架构,但它不准确,您需要数据库管理员权限才能访问,并且您的应用程序数据库用户不应该在该架构中获得授权,但在SQL Server 2005上,您还可以使用sp_spaceused存储过程:

DECLARE @rowCount AS INT
DECLARE @spaceUsed TABLE(
    [Name] varchar(64), 
    [Rows] INT,
    [Reserved] VARCHAR(50),
    [Data] VARCHAR(50),
    [Index_Size] VARCHAR(50),
    [Unused] VARCHAR(50)
)
INSERT INTO @spaceUsed EXEC sp_spaceused 'MyTableName'
SET @rowCount = (SELECT TOP 1 [Rows] FROM @spaceUsed)
SELECT @rowCount AS 'Row Count'
我已经养成了使用sp_spaceused代替SELECT COUNT*的习惯,因为它要快得多。然而,它很可能不如COUNT*准确


MSDN:

你不是说像从表中选择count*那样吗?countprimary键不会扫描所有表,所以不要害怕使用它。查看我的答案以获得更详细的信息。@MestreLion-它将扫描整个表格。对于CI,叶级别为表。它需要扫描叶页本身,因为这些信息在较高级别中不可用中间级别的页只有一个键和指针,在较低级别中的每一页都有一个键和指针他们没有关于每个子页包含多少行的信息+1到目前为止,唯一的答案是在不扫描问题的所有表格部分的情况下解决问题链接中的信息表明,使用SQLServer系统视图sys.partitions很快。您知道对于一个行数大于100000000的表,它的性能是否优于select count*from table吗?@darkcminor-它的性能很容易超过select count*from table,因为它只需要从系统表中检索一个数字,而不是扫描和计数1亿行。可能x00000逻辑读取取决于页面中的行数正确,回答很好,你介意我在这里发布该页面的代码吗?@darkcminor它肯定会更快,因为-至少-它不需要在行上放置共享锁,然而,它的准确度会更低。COUNTPK实际上比COUNT*慢。西蒙,我对此深表怀疑。你能提供一个比较慢的示例代码吗?@Simon:我不明白为什么,因为SQL内部使用主键索引来计算行数,然后使用count*。如果两个计数使用相同的索引,那么性能应该非常相似,如果不是相同的话。@Andrew-这不是你最后一次评论的情况。COUNTPK在计划中显示为Count*。尝试创建表foowide char800主键非聚集、窄int;在服务器上创建非聚集索引ix;在foo中插入SELECT object_id,object_id FROM sys.objects;从foo中选择COUNTwide;您是对的,必须测试一些示例以查看正在进行的精确优化-标记到您的示例选择countdistinct wide from foo-我要求在wide列中计算不同值的计数。查询计划显示它只访问foo.ix——我们知道它不包含这些值——那么它如何保证正确的答案呢?如果我删除该列的PK方面,它就会从表中计数。优化器走了一条捷径,说-如果是PK,我知道它是唯一的,所以它与count*相同,再次使用最窄的索引-出乎意料但很聪明。再次说明:这将扫描整个表,不建议对具有数百万行的表进行扫描。。。。
DECLARE @rowCount AS INT
DECLARE @spaceUsed TABLE(
    [Name] varchar(64), 
    [Rows] INT,
    [Reserved] VARCHAR(50),
    [Data] VARCHAR(50),
    [Index_Size] VARCHAR(50),
    [Unused] VARCHAR(50)
)
INSERT INTO @spaceUsed EXEC sp_spaceused 'MyTableName'
SET @rowCount = (SELECT TOP 1 [Rows] FROM @spaceUsed)
SELECT @rowCount AS 'Row Count'