最近のプロジェクトでは、レコード数や占有されているディスク領域の量など、データ ユーザー テーブルのサイズを確認する必要がありました。 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.comtruehttp://www.bkjia.com/PHPjc/327781.html
技術記事
最近のプロジェクトでは、レコード数や占有されているディスク領域の量など、データ ユーザー テーブルのサイズを確認する必要がありました。 MSSQLデータベースの各テーブルが占有しているスペースを確認するために、長い間オンラインで検索していました...