我正在使用Microsoft SQL Server。
我有一个已经更新了80行的表。
如果我右键单击并查看表属性,则rowcount表示10000,但TableName中的select Count(id)表示10080。
我检查了统计数据,他们的行数也是10080。
为什么属性中的Rocount和选择计数之间存在差异?
谢谢, 小号
答案 0 :(得分: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)
答案 1 :(得分:2)
更新统计信息。这是RDBMS了解表和索引当前状态的唯一方法。这也有助于RDBMS选择正确的执行路径以获得最佳性能。
SQL Server 2005
UPDATE STATISTICS dbOwner.yourTableName;
的Oracle
UPDATE STATISTICS yourSchema.yourTableName;
答案 2 :(得分:1)
属性信息缓存在SSMS中。
答案 3 :(得分:1)
有多种方法可以检查表的大小。
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);
不幸的是,最后一个查询需要超出基本选择的额外权限。