快速读取总数据量的另一种方法:sys.partitions

在我上一篇博客中提到了通过系统表拼接SQL语句,读取数据库中所有表定制数据量的方法,在回帖中,沟沟同学提到了另一种方法:

Exec sp_MSforeachtable@precommand="Createtable ##(name sysname,rowsint,reservednvarchar(20),datanvarchar(20),index_sizenvarchar(20),unusednvarchar(20))",@command1="insertinto ##exec sp_spaceused'?'",@postcommand="select*from ##"droptable ##


下面就来分析一下这种方法。


这个语句是先创建全局临时表,再遍历所有表,

执行sp_spaceused,将返回的行数和占用空间插入临时表中,最后查询表并删除表。


可以知道读取数据量的关键部分在于sp_spaceused存储过程。

这个存储过程中的表行数是从哪来的呢?它是从sys.partitions系统表中的rows列中来的。


在联机丛书中,对rows列的描述是“此分区中的大约行数”,

那么这个“大约”是虾米意思呢?

其实就是未提交的行数也会在这个表中显示。

下面就以一个简单的例子来演示一下:


1.创建一个测试表,插入3行数据,和2行未提交的数据

IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(COL VARCHAR(50))
INSERT INTO TB
SELECT 'A' UNION ALL
SELECT 'B' UNION ALL
SELECT 'C'
GO

BEGIN TRAN

INSERT INTO TB
SELECT 'D' UNION ALL
SELECT 'E'

--ROLLBACK TRAN

2.新开一个窗口,运行下面三句

SELECT * FROM TB WITH(NOLOCK)

exec SP_SPACEUSED 'TB'

SELECT ROWS
FROM SYS.PARTITIONS
where OBJECT_NAME(OBJECT_ID)='TB'

可以看到,返回的行数都是5。

如果把第一句的WITH(NOLOCK)去掉,会读不出数量,因为第一个会话的事务没提交。


3.回到第一个窗口,运行注释里的ROLLBACK TRAN回滚事务,再运行新窗口的三个查询,可以看到数量又回到3了。


因此,对于想要快速看到表中大概数据量的需求,可以使用下面的语句:

SELECT OBJECT_NAME(OBJECT_ID),ROWS
FROM SYS.PARTITIONS
ORDER BY OBJECT_NAME(OBJECT_ID)

对于只要看总数量,不需要太准确的同学来说,此语句足够了。

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页