1

SQL Server 2008 データベースのサイズを調べる必要があります。次のストアドプロシージャを使用しました

EXEC sp_spaceused

次のデータ、データベース名、データベース サイズ、未割り当て領域、予約済み、データ、index_size、未使用が返された場合

特定のテーブルを除いて、データベースのサイズを取得する方法はありますか?

このクエリを使用して、各データベース テーブルの予約サイズを取得できます

    DECLARE @LOW int
SELECT @LOW = LOW 
FROM [master].[dbo].[spt_values] (NOLOCK) 
WHERE [number] = 1 AND [type] = 'E'

SELECT TableName,[Row Count],[Size (KB)] FROM 
(
  SELECT QUOTENAME(USER_NAME(o.uid)) + '.' + 
                 QUOTENAME(OBJECT_NAME(i.id)) 
     AS TableName
     ,SUM(i.rowcnt) [Row Count]
     ,CONVERT(numeric(15,2),
        (((CONVERT(numeric(15,2),SUM(i.reserved)) * @LOW) / 1024))) AS [Size (KB)]
  FROM sysindexes i (NOLOCK)
  INNER JOIN sysobjects o (NOLOCK) 
     ON i.id = o.id AND 
     ((o.type IN ('U', 'S')) OR o.type = 'U') 
  WHERE indid IN (0, 1, 255) 
  GROUP BY 
     QUOTENAME(USER_NAME(o.uid)) + '.' + 
     QUOTENAME(OBJECT_NAME(i.id))
  HAVING SUM(i.rowcnt) > 0
) AS Z
ORDER BY [Size (KB)] DESC

しかし、これはテーブルごとに予約されたサイズしか与えないので、少し混乱します。予約サイズは?各データベース テーブルの予約サイズを合計しても、データベース サイズにはなりません。

4

2 に答える 2

2

データベースでは、テーブルだけでなく、より多くのスペースが占有されます。また、テーブル/データベースのサイズは絶えず変化することに注意してください。行が追加、削除され、何が行われたかを追跡するためにログが作成されるため、必要に応じて元に戻したりやり直したりできます。このスペースが使用されて解放されると、SQL は再び必要になる可能性が高いことを認識しているため、通常、ファイル システムに解放されることはありません。SQL は将来の使用のためにスペースを解放しますが、ファイル システムによると、そのスペースはデータベースによってまだ使用されています。

于 2012-09-26T17:46:31.353 に答える
1

sysindexes/sysobjectsなどの下位互換性ビューの使用を停止してください。

インデックス/テーブルだけではデータベース内のすべてを考慮しているわけではありませんが、このようなものの方が良い場合があります。

SELECT Size_In_MB = SUM(reserved_page_count)*8/1024.0
  FROM sys.dm_db_partition_stats
  WHERE OBJECT_NAME([object_id]) NOT IN (N'table1', N'table2');

また、なぜ非クラスター化インデックスを無視するのですか?サイズに影響しないと思いますか?ここに同様のフィルターを追加できますが、なぜ追加するのかわかりません。

AND index_id IN (0,1,255);
于 2012-09-26T17:46:12.220 に答える