我正在使用Microsoft SQL Server。与SQL Server中的Select Count不同的SQL Table Rowcount
我有一个已经由80行更新的表。
如果我点击右键,看看表性质的行数说10000但从表名一个SELECT COUNT(ID)表示10080
我检查的统计数据,他们也有10080
一个行数为什么Rocount属性和Select Count之间有区别?
感谢, 小号
我正在使用Microsoft SQL Server。与SQL Server中的Select Count不同的SQL Table Rowcount
我有一个已经由80行更新的表。
如果我点击右键,看看表性质的行数说10000但从表名一个SELECT COUNT(ID)表示10080
我检查的统计数据,他们也有10080
一个行数为什么Rocount属性和Select Count之间有区别?
感谢, 小号
此信息最有可能来自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)
酒店信息在SSMS缓存。
谢谢, 什么是清除缓存的最佳方式? dbccfreeproccache? – Stephen 2009-10-28 17:32:31
不,dbcc freeproccache不会为SSMS做任何事情。您可以尝试关闭并打开SSMS,或者您可以尝试不依赖GUI进行行计数,因为这将会很快过时。由于性能原因,SSMS不会每隔5秒检查一次行数。 – 2009-10-28 18:09:25
更新的统计信息。这是RDBMS知道表和索引当前状态的唯一方法。这也有助于RDBMS选择正确的执行路径以获得最佳性能。
SQL Server 2005中
UPDATE STATISTICS dbOwner.yourTableName;
甲骨文
UPDATE STATISTICS yourSchema.yourTableName;
谢谢,我更新了统计数据,甚至添加了FULLSCAN标志。然后,统计信息反映正确的行数,但由于某些原因,表中的行计数属性保持不变。想必是因为它缓存? – Stephen 2009-10-28 17:34:07
有各种各样的方法来检查一个表的大小。
不断可靠的全表扫描是有点慢..
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);
不幸的是,最后一个查询需要超出基本选择的额外权限。
正确。 SELECT COUNT()是**唯一**保证的方式来计数行。 – 2009-10-28 20:55:15
谢谢,这已经成功了 – Stephen 2009-10-29 09:07:05