前言
在数据库中,很多人员习惯使用SELECT COUNT(*) 、SELECT COUNT(1) 、SELECT COUNT(COL)来查询一个表有多少记录,对于小表,这种SQL的开销倒不是很大,但是对于大表,这种查询表记录数的做法就是一个非常消耗资源了,而且效率很差。下面介绍一下SQL Server、 Oracle、MySQL中如何快速获取表的记录数。
SQL SERVER 数据库
在SQL Server数据库中, 对象目录视图sys.partitions中有一个字段rows会记录表的记录数。我们以AdventureWorks2014为测试数据库。
SELECT OBJECT_NAME(object_id) AS Object_Name,
i.name AS Index_Name,
p.rows AS Table_Rows
FROM sys.partitions p
LEFT JOIN sys.sysindexes i ON p.object_id = i.id AND p.index_id = i.indid
WHERE
object_id = OBJECT_ID('TableName')
那么我们还有一些疑问,我们先来看看这些问题吧!
1:没有索引的表是否也可以使用上面脚本?
2:只有非聚集索引的堆表是否可以使用上面脚本?
3:有多个索引的表,是否记录数会存在不一致的情况?
4:统计信息不准确的表,是否rows也会不准确
5: 分区表的情况又是怎么样?
6:对象目录视图sys.partitions与sp_spaceused获取的表记录函数是否准确。
如下所示,我们先构造测试案例:
IF EXISTS(SELECT 1 FROM sys.objects WHERE type='U' AND name='TEST_TAB_ROW')
BEGIN
DROP TABLE TEST_TAB_ROW;
END
IF NOT EXISTS(SELECT 1 F