ホームページ  >  記事  >  バックエンド開発  >  MSSQLデータベースの各テーブルが占有する容量の確認について users_PHPチュートリアル

MSSQLデータベースの各テーブルが占有する容量の確認について users_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:04:221157ブラウズ

最近のプロジェクトでは、レコード数や占有されているディスク領域の量など、データ ユーザー テーブルのサイズを確認する必要がありました。 MSSQL データベース内の各テーブルが占有しているスペースを確認するために、長い間オンラインで検索していましたが、比較的問題ありません。
ただし、メソッド 2 と 3 は大量のデータを返しますが、そのうちのいくつかは私たちが気にしないデータです。AdventureWorks2012 データでテストを行いました。 2 番目のメソッド コードは次のとおりです。

コードをコピー コードは次のとおりです。

コードを表示
存在しない場合 (select * from dbo.sysobjects where id = object_id(N'[dbo].[ tablespaceinfo]' ) および 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) )
tablespaceinfo から削除 -- データテーブルをクリア
declare @tablename varchar(255) --table name
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
存在する場合 (select * from dbo.sysobjects where id = object_id(@tablename) and OBJECTPROPERTY(id, N'IsUserTable') = 1)
sp_executesql を実行
N'insert into tablespaceinfo exec sp_spaceused @tbname',
N'@tbname varchar(255)',
@tbname = @tablename
Info_cursor から NEXT を取得
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) (予約)))) -2) as int) desc

実行中の効果は次のとおりです:

明らかに、この戻り結果は間違っています。しかし、これはアイデアを提供します。 変更された 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
024as varchar(10)) + 'mb'
他のキャスト(varchar(10)として使用) +'kb'
。元の SQL ステートメントは次のとおりです:



コードをコピー

コードは次のとおりです:

コードを表示
SELECT OBJECT_NAME(id) テーブル名 ,
* 予約済み / 1024 予約済み , RTRIM(8 * dpages / 1024) + 'Mb' 使用済み ,
* (予約済み - dpages ) / 1024 未使用 ,
* dpages / 1024 - 行数 / 102 4 * minlen / 1024 free、modified sqlステートメントは次のとおりです。コピーコード:
viewコードobject object_name(id)tableename、ケース; 1024 thatn rtrim (8 * 予約 / 10244 ) + 'MB' ' ' ELSE RTRIM(reserved * 8) + 'KB'
' ' END DataReserve ,
' ' CASE WHEN dpages * 8 > 1024 RTRIM(8 * dpages / 1024) + 'MB'
' ELSE RTRIM(dpages * 8 ) + 'KB'

END used,
CASE WHEN 8 * (reserved - dpages ) > 1024
M(8 * (reserved - dpages) + 'kb'
end Unsed、
ケース(8 * dpages / 1024 * minlen / 1024)&gt; sys.sysindexes
WHERE indid = 1
AND status = 2066 -- status='18'
ORDER BY Reserved DESC


実行結果は次のとおりです。コメント!

http://www.bkjia.com/PHPjc/327781.html
www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327781.html
技術記事

最近のプロジェクトでは、レコード数や占有されているディスク領域の量など、データ ユーザー テーブルのサイズを確認する必要がありました。 MSSQLデータベースの各テーブルが占有しているスペースを確認するために、長い間オンラインで検索していました...





声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。