关于查看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 相关文章推荐
mysq GBKl乱码
Nov 28 PHP
PHP 柱状图实现代码
Dec 04 PHP
php学习笔记 [预定义数组(超全局数组)]
Jun 09 PHP
深入php多态的实现详解
Jun 09 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
Nov 28 PHP
使用php转义输出HTML到JavaScript
Mar 27 PHP
PHP多文件上传实例
Jul 09 PHP
常见的四种POST 提交数据方式(小总结)
Oct 08 PHP
PHP PDOStatement::nextRowset讲解
Feb 01 PHP
php反射学习之依赖注入示例
Jun 14 PHP
Laravel框架验证码类用法实例分析
Sep 11 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
Jun 24 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 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
js全屏显示显示代码的三种方法
2013/11/11 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
Vue.js2.0中的变化小结
2017/10/24 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
vue项目使用微信公众号支付总结及遇到的坑
2018/10/23 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python之Socket网络编程详解
2016/09/29 Python
Python子类继承父类构造函数详解
2019/02/19 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
如何通过python画loss曲线的方法
2019/06/26 Python
Python代码太长换行的实现
2019/07/05 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
幼儿园教师辞职信
2014/01/18 职场文书
宣传策划类求职信范文
2014/01/31 职场文书
日语专业个人求职信范文
2014/02/02 职场文书
爱情寄语大全
2014/04/09 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书