关于查看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 验证图片生成函数
May 21 PHP
PHP删除HTMl标签的实现代码
Jun 30 PHP
高性能PHP框架Symfony2经典入门教程
Jul 08 PHP
ThinkPHP登录功能的实现方法
Aug 20 PHP
php中ob_get_length缓冲与获取缓冲长度实例
Nov 20 PHP
PHP MSSQL 分页实例
Apr 13 PHP
PHP在线调试执行的实现方法(附demo源码)
Apr 28 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
May 12 PHP
PHP如何根据文件头检测文件类型实例代码
Oct 14 PHP
PHP使用mongoclient简单操作mongodb数据库示例
Feb 08 PHP
php把文件设置为插件的技巧方法
Feb 03 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 冒泡排序 交换排序法
2011/05/10 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
php获取根域名方法汇总
2014/10/28 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
wordpress之js库集合研究介绍
2007/08/17 Javascript
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
python写的一个squid访问日志分析的小程序
2014/09/17 Python
python实现简单的socket server实例
2015/04/29 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
python中的随机函数小结
2018/01/27 Python
Python爬虫实例扒取2345天气预报
2018/03/04 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
Python matplotlib画曲线例题解析
2020/02/07 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
运动会入场词100字
2014/02/06 职场文书
开业庆典策划方案
2014/02/18 职场文书
护士毕业实习感言
2014/03/05 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
党员十八大心得体会
2014/09/12 职场文书
无房证明范本
2014/09/17 职场文书
2014年残联工作总结
2014/11/21 职场文书
高中教师个人总结
2015/02/10 职场文书