SQL Server执行SELECT *返回行数与表存储属性记录数不符原因排查
SQL Server表查询行数与存储记录数不一致的常见原因
未提交事务的影响:当存在未提交的INSERT或DELETE操作时,表存储属性显示的记录数会包含这些未提交的行,但默认
READ COMMITTED隔离级别下的SELECT *查询无法读取未提交的数据。可以通过切换到READ UNCOMMITTED隔离级别执行计数查询验证:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT COUNT(*) FROM 你的表名;如果结果接近存储属性的记录数,说明是未提交事务导致的差异。
堆表中的幽灵记录:没有聚集索引的堆表在删除行后,被标记为删除的行不会立即被清理,这些“幽灵记录”仍会被存储属性的统计计数包含,但
SELECT *不会返回它们。可以通过重建表来清理这些记录:ALTER TABLE 你的表名 REBUILD;重建后再对比行数,若一致则是该原因。
过时的统计信息:存储属性显示的记录数通常来自系统统计信息,如果统计信息未及时更新,就会与实际查询的实时行数产生偏差。执行以下语句更新统计信息后再查看:
UPDATE STATISTICS 你的表名 WITH FULLSCAN;分区表的统计偏差:若表是分区表,存储属性的记录数是各分区统计数据的总和,若分区统计过时,就会出现总和与实际查询行数不符的情况。同样可以用上面的
UPDATE STATISTICS语句带FULLSCAN参数更新全表统计。系统视图延迟更新:存储属性的数值一般来自
sys.dm_db_partition_stats等系统视图,这些视图的数据并非实时同步,可能存在延迟。等待一段时间或手动刷新系统元数据后,数值会趋于一致。
内容的提问来源于stack exchange,提问作者Samuel.anderson
相关产品推荐
相关产品推荐

