### 数据库总记录数与所占空间查询语句解析 #### 概述 在数据库管理过程中,了解数据库中各表的记录总数以及所占用的空间大小对于优化存储、提高查询效率等有着重要的意义。本文将详细介绍如何通过SQL Server中的T-SQL语句来实现对数据库中所有表的记录数及所占空间进行查询的功能。 #### 查询所有表的记录数 我们来看如何查询数据库中所有表的记录数。给定的部分内容中提供了这样一段代码: ```sql -- 链接部分:统计每个表的记录数 SET NOCOUNT ON; CREATE TABLE ##temp (ZKIns varchar(50), [Count] int); DECLARE @name varchar(50); SET @name = ''; DECLARE cur_1 CURSOR FOR SELECT [name] FROM sysobjects WHERE xtype = 'U' ORDER BY [id]; OPEN cur_1; FETCH NEXT FROM cur_1 INTO @name; WHILE (@@FETCH_STATUS = 0) BEGIN EXEC ('INSERT INTO ##temp SELECT ''' + @name + ''' AS [name], COUNT(*) AS [Count] FROM [' + @name + '] a, sysobjects b WHERE b.id = OBJECT_ID(''' + @name + ''')'); FETCH NEXT FROM cur_1 INTO @name; END SELECT * FROM ##temp ORDER BY [Count] DESC; SELECT SUM([Count]) FROM ##temp; DROP TABLE ##temp; CLOSE cur_1; DEALLOCATE cur_1; ``` 这段代码的主要作用是遍历数据库中所有的表,并计算每个表的记录数,最后汇总并显示这些记录数。具体步骤如下: 1. **创建临时表**:首先创建一个名为`##temp`的临时表,用于存储每个表的名称及其对应的记录数。 2. **声明变量**:声明一个变量`@name`用于存储表名。 3. **定义游标**:定义一个游标`cur_1`,用于循环遍历`sysobjects`表中的所有用户表(`xtype = 'U'`)。 4. **遍历并计算**:通过游标遍历所有表,使用动态SQL执行插入操作,将表名和该表的记录数插入到`##temp`中。 5. **查询结果**:最后查询`##temp`表中的数据,按照记录数降序排序,并计算所有表的记录总数。 6. **清理资源**:删除临时表并关闭游标。 #### 查询各个表所占空间 接下来,我们来看如何查询数据库中各个表所占用的空间大小。这部分内容涉及到了`sp_spaceused`存储过程和自定义的`tablespaceinfo`表的使用: ```sql -- 链接部分:查询每个表的空间使用情况 IF NOT EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[tablespaceinfo]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) CREATE TABLE tablespaceinfo -- 表空间信息表 ( nameinfo varchar(50), rowsinfo int, reserved varchar(20), datainfo varchar(20), index_size varchar(20), unused varchar(20) ); DELETE FROM tablespaceinfo; -- 清空表空间信息表 -- 游标定义与处理逻辑 DECLARE @tablename varchar(255); DECLARE Info_cursor CURSOR FOR SELECT o.name FROM dbo.sysobjects o WHERE OBJECTPROPERTY(o.id, N'IsTable') = 1 AND o.name NOT LIKE N'#%%' ORDER BY o.name; OPEN Info_cursor; FETCH NEXT FROM Info_cursor INTO @tablename; WHILE @@FETCH_STATUS = 0 BEGIN IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(@tablename) AND OBJECTPROPERTY(id, N'IsUserTable') = 1) EXECUTE sp_executesql N'INSERT INTO tablespaceinfo EXEC sp_spaceused @tbname', N'@tbname varchar(255)', @tbname = @tablename; FETCH NEXT FROM Info_cursor INTO @tablename; END CLOSE Info_cursor; DEALLOCATE Info_cursor; -- 更新表空间信息 EXEC sp_spaceused @update_usage = 'TRUE'; -- 显示结果 SELECT * FROM tablespaceinfo ORDER BY CAST(LEFT(LTRIM(RTRIM(reserved)), LEN(LTRIM(RTRIM(reserved))) - 2) AS int) DESC; ``` 此段代码的主要功能是: 1. **创建`tablespaceinfo`表**:用于存储每个表的信息,包括表名、行数、已分配空间、数据空间、索引空间以及未使用空间。 2. **定义游标**:定义游标`Info_cursor`用于遍历所有的用户表。 3. **遍历表并调用存储过程**:对于每个表,调用`sp_spaceused`存储过程获取其空间使用情况,并将结果插入到`tablespaceinfo`表中。 4. **更新表空间信息**:通过调用`sp_spaceused`存储过程,设置`@update_usage = 'TRUE'`参数,更新表空间信息。 5. **查询结果**:最后查询`tablespaceinfo`表中的数据,按已分配空间大小降序排列。 以上两部分代码结合使用,可以有效地帮助我们了解数据库中各表的记录总数以及它们所占用的空间大小,这对于数据库性能优化具有非常重要的参考价值。
set nocount on
create table ##(ZKIns varchar(50),[count] int)
declare @name varchar(50)
set @name=''
declare cur_1 cursor for
select [name] from sysobjects where xtype='U' order by [id]
open cur_1
fetch next from cur_1 into @name
while(@@FETCH_STATUS=0)
begin
exec('insert into ## select '''+@name+''' as [name],count(*) as [count] from ['+@name+'] a,sysobjects b where b.id=object_id('''+@name+''')')
fetch next from cur_1 into @name
end
select * from ## order by count desc
select sum(count) from ##
drop table ##
close cur_1
deallocate cur_1
--查看数据表使用情况
- zhangjfwy2013-03-24内容挺丰富的
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助