关于查看MSSQL 数据库 用户每个表 占用的空间大小


Posted in PHP onJune 21, 2013

最近做项目需要查看数据用户表的大小,包括记录条数和占用的磁盘空间数目。在网上找了很久其中查看MSSQL数据库每个表占用的空间大小 相对还可以。
不过它的2、3中方法返回的数据比较多,有些是我们不关心的数据,我在AdventureWorks2012数据上做的测试。其中第二种方法代码如下:

View Code 
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 @cmdsql varchar(500)
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
GO
--itlearner注:显示数据库信息
sp_spaceused @updateusage = 'TRUE' 
--itlearner注:显示表信息
select * 
from tablespaceinfo 
order by cast(left(ltrim(rtrim(reserved)) , len(ltrim(rtrim(reserved)))-2) as int) desc

运行效果如图:
关于查看MSSQL 数据库 用户每个表 占用的空间大小 
很显然这个返回结果是错误的。但是它提供了一种思路,修改后的SQL语句如下:
View Code 
IF NOT EXISTS ( SELECT  *
                FROM    sys.tables
                WHERE   name = 'tablespaceinfo' ) 
    BEGIN
        CREATE TABLE tablespaceinfo --创建结果存储表
            (
              Table_Name VARCHAR(50) ,
              Rows_Count INT ,
              reserved INT ,
              datainfo INT ,
              index_size INT ,
              unused INT
            )
    END 
DELETE  FROM tablespaceinfo
 --清空数据表
CREATE TABLE #temp --创建结果存储表
    (
      nameinfo VARCHAR(50) ,
      rowsinfo INT ,
      reserved VARCHAR(20) ,
      datainfo VARCHAR(20) ,
      index_size VARCHAR(20) ,
      unused VARCHAR(20)
    )
DECLARE @tablename VARCHAR(255)
 --表名称
DECLARE @cmdsql NVARCHAR(500)
DECLARE Info_cursor CURSOR
FOR
    SELECT  '[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']' AS Table_Name
    FROM    [INFORMATION_SCHEMA].[TABLES]
    WHERE   TABLE_TYPE = 'BASE TABLE'
            AND TABLE_NAME <> 'tablespaceinfo'
OPEN Info_cursor
FETCH NEXT FROM Info_cursor
INTO @tablename
WHILE @@FETCH_STATUS = 0 
    BEGIN
        SET @cmdsql = 'insert into #temp exec sp_spaceused ''' + @tablename
            + ''''
        EXECUTE sp_executesql @cmdsql
        FETCH NEXT FROM Info_cursor
INTO @tablename
    END
CLOSE Info_cursor
DEALLOCATE Info_cursor
GO
--itlearner注:显示数据库信息
--sp_spaceused @updateusage = 'TRUE'
--itlearner注:显示表信息
UPDATE  #temp
SET     reserved = REPLACE(reserved, 'KB', '') ,
        datainfo = REPLACE(datainfo, 'KB', '') ,
        index_size = REPLACE(index_size, 'KB', '') ,
        unused = REPLACE(unused, 'KB', '')
INSERT  INTO dbo.tablespaceinfo
        SELECT  nameinfo ,
                CAST(rowsinfo AS INT) ,
                CAST(reserved AS INT) ,
                CAST(datainfo AS INT) ,
                CAST(index_size AS INT) ,
                CAST(unused AS INT)
        FROM    #temp
DROP TABLE #temp
SELECT  Table_Name ,
        Rows_Count ,
        CASE WHEN reserved > 1024
             THEN CAST(reserved / 1024 AS VARCHAR(10)) + 'Mb'
             ELSE CAST(reserved AS VARCHAR(10)) + 'KB'
        END AS Data_And_Index_Reserved ,
        CASE WHEN datainfo > 1024
             THEN CAST(datainfo / 1024 AS VARCHAR(10)) + 'Mb'
             ELSE CAST(datainfo AS VARCHAR(10)) + 'KB'
        END AS Used ,
        CASE WHEN Index_size > 1024
             THEN CAST(index_size / 1024 AS VARCHAR(10)) + 'Mb'
             ELSE CAST(index_size AS VARCHAR(10)) + 'KB'
        END AS index_size ,
        CASE WHEN unused > 1024 THEN CAST(unused / 1024 AS VARCHAR(10)) + 'Mb'
             ELSE CAST(unused AS VARCHAR(10)) + 'KB'
        END AS unused
FROM    dbo.tablespaceinfo
ORDER BY reserved DESC

运行结果如图:
关于查看MSSQL 数据库 用户每个表 占用的空间大小
同时他的第三种方法返回的数据太多,很多是我们不怎么关心的,原SQL语句如下:
View Code 
SELECT  OBJECT_NAME(id) tablename ,
 * reserved / 1024 reserved ,
        RTRIM(8 * dpages / 1024) + 'Mb' used ,
 * ( reserved - dpages ) / 1024 unused ,
 * dpages / 1024 - rows / 1024 * minlen / 1024 free ,
        rows
FROM    sysindexes
WHERE   indid = 1
ORDER BY reserved DESC

运行结果如图:
关于查看MSSQL 数据库 用户每个表 占用的空间大小
这里面包含一些索引信息,其实我们只关心表占用磁盘信息,修改后的SQL语句如下:
View Code 
SELECT  OBJECT_NAME(id) tablename ,
        CASE WHEN reserved * 8 > 1024 THEN RTRIM(8 * reserved / 1024) + 'MB'
             ELSE RTRIM(reserved * 8) + 'KB'
        END DataReserve ,
        CASE WHEN dpages * 8 > 1024 THEN RTRIM(8 * dpages / 1024) + 'MB'
             ELSE RTRIM(dpages * 8) + 'KB'
        END Used ,
        CASE WHEN 8 * ( reserved - dpages ) > 1024
             THEN RTRIM(8 * ( reserved - dpages ) / 1024) + 'MB'
             ELSE RTRIM(8 * ( reserved - dpages )) + 'KB'
        END unused ,
        CASE WHEN ( 8 * dpages / 1024 - rows / 1024 * minlen / 1024 ) > 1024
             THEN RTRIM(( 8 * dpages / 1024 - rows / 1024 * minlen / 1024 )
                        / 1024) + 'MB'
             ELSE RTRIM(( 8 * dpages / 1024 - rows / 1024 * minlen / 1024 ))
                  + 'KB'
        END FREE ,
        rows AS Rows_Count
FROM    sys.sysindexes
WHERE   indid = 1
        AND status = 2066 -- status='18'
ORDER BY reserved DESC

运行结果如下:
关于查看MSSQL 数据库 用户每个表 占用的空间大小
有不对的地方欢迎大家拍砖!
PHP 相关文章推荐
PHP.MVC的模板标签系统(二)
Sep 05 PHP
php,不用COM,生成excel文件
Oct 09 PHP
PHP+MySQL 制作简单的留言本
Nov 02 PHP
深入解析php之apc
May 15 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
带你了解PHP7 性能翻倍的关键
Nov 19 PHP
PHP实现的常规正则验证helper公共类完整实例
Apr 27 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 PHP
php判断/计算闰年的方法小结【三种方法】
Jul 06 PHP
laravel 中某一字段自增、自减的例子
Oct 11 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
Jan 26 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 #PHP
Function eregi is deprecated (解决方法)
Jun 21 #PHP
解析php中获取url与物理路径的总结
Jun 21 #PHP
解析php函数method_exists()与is_callable()的区别
Jun 21 #PHP
深入理解PHP中的Session和Cookie
Jun 21 #PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 #PHP
解析PHP中一些可能会被忽略的问题
Jun 21 #PHP
You might like
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
JavaScript之map reduce_动力节点Java学院整理
2017/06/29 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
Python实现的RSS阅读器实例
2015/07/25 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
python实现梯度下降算法
2020/03/24 Python
flask应用部署到服务器的方法
2019/07/12 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
文明倡议书范文
2014/04/15 职场文书
四风个人对照检查材料思想汇报
2014/09/25 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
党的群众路线教育实践活动个人整改措施材料
2014/11/04 职场文书
车间统计员岗位职责
2015/04/14 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js