2009-10-28 63 views
3

我正在使用Microsoft SQL Server。与SQL Server中的Select Count不同的SQL Table Rowcount

我有一个已经由80行更新的表。

如果我点击右键,看看表性质的行数说10000但从表名一个SELECT COUNT(ID)表示10080

我检查的统计数据,他们也有10080

一个行数

为什么Rocount属性和Select Count之间有区别?

感谢, 小号

回答

3

此信息最有可能来自sysindexes表(请参阅文档)和sysindexes中的 信息不能保证被上调至今。这是SQL Server中的一个已知事实。

尝试运行DBCC UPDATEUSAGE,并再次检查值。
价:http://msdn.microsoft.com/en-us/library/ms188414.aspx

DBCC UPDATEUSAGE校正行, 使用的页面,保留页,叶页 和数据页计数表或索引的每个 分区。如果 有在 系统表中没有不准确,DBCC UPDATEUSAGE 返回数据。如果发现并更正了错误 ,并且使用了WITH 未使用NO_INFOMSGS,则DBCC UPDATEUSAGE返回表 中正在更新的行和 列。

实施例:

DBCC UPDATEUSAGE (0) 
+0

正确。 SELECT COUNT()是**唯一**保证的方式来计数行。 – 2009-10-28 20:55:15

+0

谢谢,这已经成功了 – Stephen 2009-10-29 09:07:05

1

酒店信息在SSMS缓存。

+0

谢谢, 什么是清除缓存的最佳方式? dbccfreeproccache? – Stephen 2009-10-28 17:32:31

+0

不,dbcc freeproccache不会为SSMS做任何事情。您可以尝试关闭并打开SSMS,或者您可以尝试不依赖GUI进行行计数,因为这将会很快过时。由于性能原因,SSMS不会每隔5秒检查一次行数。 – 2009-10-28 18:09:25

2

更新的统计信息。这是RDBMS知道表和索引当前状态的唯一方法。这也有助于RDBMS选择正确的执行路径以获得最佳性能。

SQL Server 2005中

UPDATE STATISTICS dbOwner.yourTableName; 

甲骨文

UPDATE STATISTICS yourSchema.yourTableName; 
+0

谢谢,我更新了统计数据,甚至添加了FULLSCAN标志。然后,统计信息反映正确的行数,但由于某些原因,表中的行计数属性保持不变。想必是因为它缓存? – Stephen 2009-10-28 17:34:07

0

有各种各样的方法来检查一个表的大小。

http://blogs.msdn.com/b/martijnh/archive/2010/07/15/sql-server-how-to-quickly-retrieve-accurate-row-count-for-table.aspx提到的各种精度和速度的4。

不断可靠的全表扫描是有点慢..

SELECT COUNT(*) FROM Transactions 

和快速替代取决于统计

SELECT CONVERT(bigint, rows) 
FROM sysindexes 
WHERE id = OBJECT_ID('Transactions') 
AND indid < 2 

它还提到SSMS的GUI使用查询

SELECT CAST(p.rows AS float) 
FROM sys.tables AS tbl 
INNER JOIN sys.indexes AS idx ON idx.object_id = tbl.object_id and idx.index_id < 2 
INNER JOIN sys.partitions AS p ON p.object_id=CAST(tbl.object_id AS int) 
AND p.index_id=idx.index_id 
WHERE ((tbl.name=N'Transactions' 
AND SCHEMA_NAME(tbl.schema_id)='dbo')) 

和快速,而且比较准确的方法来大小表是

SELECT SUM (row_count) 
FROM sys.dm_db_partition_stats 
WHERE object_id=OBJECT_ID('Transactions') 
AND (index_id=0 or index_id=1); 

不幸的是,最后一个查询需要超出基本选择的额外权限。