SQL Serverでテーブルのサイズを決定する

あなたのデータベースにどれくらいのテーブルが本当にあるのだろうか?テーブルには100万行もありますが、それは実際にどのくらいのスペースがありますか?

SQL Serverには、インデックスのサイズなどテーブルのサイズを簡単に表示するために実行できるビルトインストアドプロシージャが用意されています。

構文

sp_spaceused ‘Tablename’

実際の例

非常に便利なもの。インデックスが実際のデータよりも大きいことは常に興味深いことです。

これは、テーブルに割り当てられた領域を決定するための便利なコマンドですが、sp_spaceusedはスペース属性を取得するためにsysindexesシステムテーブルを参照し、時にはそこに格納されているものが現実と同期しなくなる可能性があることに注意してください。空白(特に ‘未使用’の値)が不足している場合は、sp_spacesuedを実行する前に該当するテーブルに対して「DBCC UPDATEUSAGE」コマンドを実行します(データベースがない場合はデータベース全体に対して実行します)。誰かのつま先で足踏みをすることを心配している)。

これは、sp_spaceused内のオプションのパラメータとして自動的に実行できます…

例えばsp_spaceused ‘Orders’、true

…または以下に示すように別々のコマンドとして。

現在のデータベース全体の使用状況を更新する構文は、DBCC UPDATEUSAGE(0)

特定の名前付きデータベースの場合、DBCC UPDATEUSAGE( ‘InsertdDbNameHere’)

特定のテーブル; DBCC UPDATEUSAGE( ‘InsertdDbNameHere’、 ‘InsertdTableNameHere’)

DBCC UPDATEUSAGEのすべての詳細についてBOLをいつでもチェックすることができます

ありがとうございます。クエリアナライザを使用して、sp_spaceusedを実行すると便利ですが、データベースに100を超えるテーブルがあるとどうなりますか?とにかくデータベース全体のサイズを返すのですか?

私はちょうどこれを見つけました、それは各テーブルに使用されるスペースを返します

EXEC sp_MSforeachtable @ command1 = “EXEC sp_spaceused ‘?'”

チャールズsp_helpdb

Rick – それはすべての時間の最も有用なSQL Serverコマンドの1つです。あなたは一番です。

私はRicks Tippを使いこなそうとしましたが、データベースに181のテーブルを持たないことはそれほどうまくいきませんでした。また、sp_spaceusedを使用した彼のMechanicは、各テーブルをスタンドアロンクエリとして扱いました。自動化されたデータベースの成長統計では使用できなくなりました。

私はsp_spaceusedのロジックを盗んだ/借用し、それを次のVIEWに適用しました(ここで私は統計テーブルに追加して、いくつかの方法で照会できます)

DataSpaceとしての8192/1024ページ、(usedpages-pages)* IndexSpaceとしての8192/1024、(Reservedpages-usedpages)* 8192/1024 as UnusedSpace

FROM(SELECT; t。[name] as tablename; NumRowsとしてのavg([rows]);予約ページとしての合計(total_pages); usedページとしてのsum_cages; sum; CASE; when it.internal_type IN(202,204) a.type 1のときa.used_pa​​ges; p.index_idのとき

バー、それはカットされて、残りはここにあります

p.index_id

p.index_id

(2)a.data_pages; Else 0; END)をページとして、sys.allocation_unitsから結合sys.partitionsをpとしてp.partition_id = a.container_id; left join sys.internal_tables it on p.object_id = it.object_id;副選択として、p.object_id = t.object_id; -WHERE t.name = ‘mittra’; tでグループ化[name])でJOIN sys.tablesを継承する

リック、感謝の気持ち!!!!!とても助かりました!

リック、ありがとう!

私はTSQLFundamentals2008データベースを使用していますが、このデータベースにはスキーマ名HRが含まれていますが、次のコードではエラーが発生しました。

TSQLFundamentals2008; exec sp_spaceused HR.Employeesを使用します。

-Error;メッセージ102、レベル15、状態1、行2; ‘。’の近くの構文が正しくありません。

私はスキーマ名なしのコードを使ってみました

TSQLFundamentals2008を使用する; exec sp_spaceused Employees

-Error;メッセージ15009、レベル16、状態1、プロシージャsp_spaceused、行62;オブジェクト ‘Employees’はデータベース ‘TSQLFundamentals2008’に存在しないか、この操作には無効です。

plsのヘルプ

ちょっとナシフ

試してみてください

sp_spaceused ‘HR.Employees’

上記はエラーなしで実行されます

新しいSQLです。私はすべてのテーブルとそれらのサイズのリストを持っているので、どちらが手を抜いているのか分かります。 sp_spaceusedは、70個のテーブルすべてに対して個別に行う必要があることを意味します。 sp_helpdbはテーブル全体を表示します

ねえ、みんなはこのコードを試して..まるでsp_spaceusedのように。このスクリプトをターゲットデータベースに実行するだけで済みます。

VARCHAR(500); VARCHAR(500); DECLARE @schema_name VARCHAR(500); DECLARE @ tab1テーブル; tablename VARCHAR(500)の照合データベース_default、schemaname VARCHAR(500)照合データベース_default; CREATE TABLE #temp_Table; tablename sysname、row_count BIGINT、予約済みVARCHAR (50)collat​​e database_default、data VARCHAR(50)collat​​e database_default、index_size VARCHAR(50)はデータベースのデフォルト値を使用しませんVARCHAR(50)はデータベースのデフォルトを照合します; INSERT INTO @ tab1; SELECT Table_Name、Table_Schema; FROM information_schema.tables; WHERE TABLE_TYPE = ‘BASE TABLE ‘;テーブル1;テーブル1;テーブル2;テーブル3;テーブル2;テーブル3;テーブル3; ; SET @table_name = REPLACE(@table_name、 ‘[‘、 “); SET @テーブル名= REPLACE(@テーブル名、 ‘]’、”); – sp_spaceusedを呼び出す前にオブジェクトが存在することを確認する; IF EXISTS(SELECT id FROM sysobjects WHERE id = OBJECT_ID(@テーブル名)); BEGIN; INSERT INTO #temp_Table EXEC sp_spaceused @table_name、false; END; FETCH NEXT FROM c1 INTO @テーブル名; END;クローズc1; DEALLOCATE c1; SELECT t1。*、t2.schemaname; FROM #temp_Table t1; INNER JOIN @ tab1 t2 ON(t1 .tablename = t2.tablename); ORDER BY schemaname、t1.tablename; DROP TABLE #temp_Table

それはうまくいったNItinそれが働いた…

すばらしいスレッドとアドバイスありがとうございます。

ここにはスキーマ名のあるものもあります=============================

DataSpaceとして8192/1024、(usedpages-pages)* 8192/1024をIndexSpace、(reservedpages-usedpages)* 8192/1024をUnusedSpace、FROM( SELECT; s;名前としてスキーマ名; t。[名前] as tablename; avg([行])としてNumRows; sum(総ページ数)を予約ページ; sum(used_pa​​ges)をusedpages; sum; CASE; when it.internal_type IN (202,204)Then 0; a.type = 1のときa.used_pa​​ges; p.index_id <2のときa.data_pages; Else 0; END)ページとして、sys.allocation_unitsからJoin sys.partitionsをp on p .partition_id = a.container_id;左にjoin sys.internal_tablesこれはp.object_id = it.object_idにあります.p.object_id = t.object_idでtとしてJOIN sys.tables; t.schema_id = sでsとしてsys.schemasを結合します。 schema_id; -WHERE t.name = 'Constraints.Level60Zone;副選択としてのs。[name]、t。[name]によるグループ化 schemaname、tablenameで注文する メインシステムをsp_spaceusedにして、次のスクリプトを使用すると、DB領域の使用量をフルに活用できます。------------------------------- -------------- CREATE TABLE #TmpTableUsage(TableName varchar(100)、NumRows int、TotalSpace int、DataSpace int、IndexSpace int、UnusedSpace int) もしisnull(Object_id( 'Tempdb ..#TmpSpaceUsage')、0)0; DROP TABLE #TmpSpaceUsage CREATE TABLE #TmpSpaceUsage(TableName varchar(100)、NumRows int、TotalSpace varchar(50)、DataSpace varchar(50)、IndexSpace varchar(50)、UnusedSpace varchar(50)) #TmpSpaceUsageに挿入; EXEC sp_MSforeachtable @ command1 = "EXEC sp_spaceused '?'" (DataSpace、1、Len(DataSpace)-3)をIntとしてキャストすると、次のようになります。#TmpTableUsageに挿入し、TableNameを選択し、NumRows、Cast(TotalSpace、1、Len(TotalSpace)-3) DataSpace; UnusedSpaceとしてcast(substring(UnusedSpace、1、Len(UnusedSpace)-3)をInt)としてキャスト(サブストリング(IndexSpace、1、Len(IndexSpace)-3)をIntとして使用); from #TmpSpaceUsage #TmpTableUsageから*を選択 テーブルに複数のパーティションがある場合、Lnu76またはRKの有効な解決策ではありません。また、indexspaceは常にゼロであり、これも間違っています。 私は行ごとの平均スペース使用量を含むトップテーブルを取得するように再フォーマットしました もしisnull(Object_id( 'Tempdb ..#TmpTableUsage')、0)0; DROP TABLE #TmpTableUsage CREATE TABLE #TmpTableUsage(TableName varchar(100)、NumRows int、TotalSpace int、DataSpace int、IndexSpace int、UnusedSpace int) もしisnull(Object_id( 'Tempdb ..#TmpSpaceUsage')、0)0; DROP TABLE #TmpSpaceUsage CREATE TABLE #TmpSpaceUsage(TableName varchar(100)、NumRows int、TotalSpace varchar(50)、DataSpace varchar(50)、IndexSpace varchar(50)、UnusedSpace varchar(50)) #TmpSpaceUsageに挿入; EXEC sp_MSforeachtable @ command1 = "EXEC sp_spaceused '?'" (DataSpace、1、Len(DataSpace)-3)をIntとしてキャストすると、次のようになります。#TmpTableUsageに挿入し、TableNameを選択し、NumRows、Cast(TotalSpace、1、Len(TotalSpace)-3) DataSpace; UnusedSpaceとしてcast(substring(UnusedSpace、1、Len(UnusedSpace)-3)をInt)としてキャスト(サブストリング(IndexSpace、1、Len(IndexSpace)-3)をIntとして使用); from #TmpSpaceUsage CONVERT(DECIMAL(10,2)、TotalSpace)> 0次に、CONVERT(DECIMAL(10,2)、CONVERT(DECIMAL(10,2)、TotalSpace)/ NumRows)を変換すると、TableName、NumRows、AvgSpacePerRow = (10,2)、CONVERT(DECIMAL(10,2)、DataSpace)/ 1024)のように、変換(合計(10,2)、変換(DECIMAL(10,2)、合計スペース)/ 1024) DataSpaceMBとして; IndexSpaceMB; UnusedSpaceKBとしての変換; #TmpTableUsageから; NumRows> = 1; TotalSpace Descによる変換(変換(DECIMAL(10,2)、変換(DECIMAL(10,2)、IndexSpace)/ 1024)

アメリカの新聞に掲載された最初の漫画は、父親のベン・フランクリンの創立以外には何も書かれていませんでした。