zoukankan      html  css  js  c++  java
  • SQL Server表和模式空间使用情况http://www.51myit.com/thread2466911.html

    SQL Server数据库管理员常常会头疼硬盘可用空间太少,往往需要编写很多查询来查明哪些表和模式占用了大量的硬盘空间,以便能够定期清理这些表和模式。本文将为大家阐述如何查询系统目录来确定磁盘空间的使用情况,可以帮助SQL Server数据库管理员识别占用最大空间的表和模式,以便将老旧的数据归档,将不需要的数据清除。本文所列脚本适用于SQL Server 2005和SQL Server 2008 CTP5。

      步骤1:如图一所示,登录到SQL Server实例

    步骤2:确定你想要获得空间使用信息的数据库,导航到该数据库,如下所示(见图二)

      Use AdventureWorks

      go

    步骤3.1:将下面的代码添加到查询窗口,并执行(见图三)。
      begin try
    SELECT
    (row_number() over(order by a3.name, a2.name))%2 as l1,
    a3.name AS [schemaname],
    a2.name AS [tablename],
    a1.rows as row_count,
    (a1.reserved + ISNULL(a4.reserved,0))* 8 AS reserved,
    a1.data * 8 AS data,
    (CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN
       (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 AS index_size,
    (CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN
       (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8 AS unused
    FROM
    (SELECT
      ps.object_id,
      SUM (
       CASE
        WHEN (ps.index_id < 2) THEN row_count
        ELSE 0
       END
       ) AS [rows],
      SUM (ps.reserved_page_count) AS reserved,
      SUM (
       CASE
         WHEN (ps.index_id < 2) THEN
       (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count)
         ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)
       END
       ) AS data,
      SUM (ps.used_page_count) AS used
    FROM sys.dm_db_partition_stats ps
    GROUP BY ps.object_id) AS a1
    LEFT OUTER JOIN
    (SELECT
      it.parent_id,
      SUM(ps.reserved_page_count) AS reserved,
      SUM(ps.used_page_count) AS used
      FROM sys.dm_db_partition_stats ps
      INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)
      WHERE it.internal_type IN (202,204)
      GROUP BY it.parent_id) AS a4 ON (a4.parent_id = a1.object_id)
    INNER JOIN sys.all_objects a2  ON ( a1.object_id = a2.object_id )
    INNER JOIN sys.schemas a3 ON (a2.schema_id = a3.schema_id)
    WHERE a2.type <> 'S' and a2.type <> 'IT'
    ORDER BY a3.name, a2.name
    end try
    begin catch
    select
    -100 as l1
    , 1 as schemaname
    ,       ERROR_NUMBER() as tablename
    ,       ERROR_SEVERITY() as row_count
    ,       ERROR_STATE() as reserved
    ,       ERROR_MESSAGE() as data
    ,       1 as index_size
    ,   1 as unused
    end catch

    执行上述代码的时候,我们可以看到表空间使用报告(见图四)。

     步骤3.2:上述脚本可进行一定修改,使用SUM、COUNT函数并通过从句进行分组,以显示模式空间的使用情况。将以下代码添加到查询窗口,并运行(见图五)。
      begin try
    SELECT
    (row_number() over(order by a3.name, a2.name))%2 as l1,
    a3.name AS [schemaname],
    count(a2.name ) as NumberOftables,
    sum(a1.rows) as row_count,
    sum((a1.reserved + ISNULL(a4.reserved,0))* 8) AS reserved,
    sum(a1.data * 8) AS data,
    sum((CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN
       (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 )AS index_size,
    sum((CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN
       (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8) AS unused
    FROM
    (SELECT
      ps.object_id,
      SUM (
       CASE
        WHEN (ps.index_id < 2) THEN row_count
        ELSE 0
       END
       ) AS [rows],
      SUM (ps.reserved_page_count) AS reserved,
      SUM (
       CASE
        WHEN (ps.index_id < 2) THEN
         (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count)
        ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)
       END
       ) AS data,
      SUM (ps.used_page_count) AS used
    FROM sys.dm_db_partition_stats ps
    GROUP BY ps.object_id) AS a1
    LEFT OUTER JOIN
    (SELECT
      it.parent_id,
      SUM(ps.reserved_page_count) AS reserved,
      SUM(ps.used_page_count) AS used
      FROM sys.dm_db_partition_stats ps
      INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)
      WHERE it.internal_type IN (202,204)
      GROUP BY it.parent_id) AS a4 ON (a4.parent_id = a1.object_id)
    INNER JOIN sys.all_objects a2  ON ( a1.object_id = a2.object_id )
    INNER JOIN sys.schemas a3 ON (a2.schema_id = a3.schema_id)
    WHERE a2.type <> 'S' and a2.type <> 'IT'
    group by a3.name
    ORDER BY a3.name
    end try
    begin catch
    select
    -100 as l1
    , 1 as schemaname
    ,       ERROR_NUMBER() as tablename
    ,       ERROR_SEVERITY() as row_count
    ,       ERROR_STATE() as reserved
    ,       ERROR_MESSAGE() as data
    ,       1 as index_size
    ,   1 as unused
    end catch
  • 相关阅读:
    文件下载(Servlet/Struts2)
    Spring学习(一)---依赖注入和控制反转
    MyBatis学习(三)---MyBatis和Spring整合
    MyBatis学习(二)---数据表之间关联
    MyBatis学习(一)---配置文件,Mapper接口和动态SQL
    转载:常见端口介绍
    CentOS7 yum提示:another app is currently holding the yum lock;waiting for it to exit
    批量删除文件,只保留目录下最新的几个文件,其他均删除
    转载:SQL Server 如何设置数据库的默认初始大小和自动增长大小
    阿里云ECS使用秘钥或者密码登录
  • 原文地址:https://www.cnblogs.com/si812cn/p/1233798.html
Copyright © 2011-2022 走看看