关于查看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 相关文章推荐
第1次亲密接触PHP5(2)
Oct 09 PHP
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
PHP实现用户认证及管理完全源码
Mar 11 PHP
php的access操作类
Apr 09 PHP
php session 预定义数组
Mar 16 PHP
一个php Mysql类 可以参考学习熟悉下
Jun 21 PHP
PHP制作万年历
Jan 07 PHP
php中this关键字用法分析
Dec 07 PHP
php写app接口并返回json数据的实例(分享)
May 20 PHP
Laravle eloquent 多对多模型关联实例详解
Nov 22 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 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和MySQL保存和输出图片
2006/10/09 PHP
php一些公用函数的集合
2008/03/27 PHP
php mysql索引问题
2008/06/07 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
php实现的PDO异常处理操作分析
2018/12/27 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
vue.js 上传图片实例代码
2017/06/22 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
分享vim python缩进等一些配置
2018/07/02 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
使用python os模块复制文件到指定文件夹的方法
2019/08/22 Python
Python 转换文本编码实现解析
2019/08/27 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
硕士研究生个人求职信
2013/12/04 职场文书
犯错检讨书
2014/02/21 职场文书
汽车促销活动方案
2014/03/31 职场文书
公司安全管理制度范本
2015/08/05 职场文书
python爬虫之利用selenium模块自动登录CSDN
2021/04/22 Python
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python