3

SQL Server 2008では、SQL Server(2008 R2)の特定のインスタンス(またはすべてのインスタンス)のテーブルスペース使用率をどのように(SQLクエリを通じて)見つけることができますか?SQL Server 2008での合計表領域使用状況を調べる方法は?

また、SQL Serverのすべての名前付きインスタンスの一覧を取得するための最良の方法(クエリ)は何ですか?

+0

たぶん[http://dba.stackexchange.comで尋ねたより良いです/](http://dba.stackexchange.com/) – Filburt

+0

試してみてくださいhttp://msdn.microsoft.com/en-us/library/ms188776.aspx –

+0

[このページ]( http://www.mssqltips.com/sqlservertip/1177/determining-space-used-for-each-table-in-a-sql-server-database/)おそらくあなたの質問に答えます – harry

答えて

2

は、スクリプトを使用します。

set nocount on 
declare @indexes table(
    QualifiedName nvarchar(512), 
    IndexId   int, 
    FGName   nvarchar(128),  
    Type   nvarchar(50), 
    NumKeys   int, 
    IndexKB   numeric(28,0), 
    UsedKB   numeric(28,0), 
    FreeKB   numeric(28,0), 
    Rows   numeric(28,0), 
    RowModCtr  numeric(28,0), 
    OrigFillFactor int, 
    tableid   bigint 
    ) 

insert into @indexes 
select 
    db_name() + '.' + isnull(su.name,'<unknown-user>') + '.' + so.name + '.' + isnull(i.name,'<Heap>') QualifiedName, 
    i.index_id IndexId, 
    (select isnull(name,'') from sys.filegroups where data_space_id = i.data_space_id) FGName, 
    case 
     when so.type = 'V' then 'Indexed View: ' 
     else '' 
    end + 
    case 
     when i.index_id = 0 then 'Heap' 
     when i.index_id = 1 then 'Clustered' 
     else 'Non Clustered' 
    end Type, 
    0 NumKeys, 
    a.used_pages* 8 IndexKB, 
    CASE 
     When a.type <> 1 Then a.used_pages * 8 
     When p.index_id < 2 Then a.data_pages * 8 
     Else 0 
     END UsedKB, 
    (a.total_pages-a.used_pages)* 8 FreeKB, 
    p.rows Rows, 
    0 RowModCtr, 
    i.fill_factor OrigFillFactor, 
    convert(bigint,db_id()) * power(convert(bigint,2),48) + convert(bigint,su.schema_id) * power(convert(bigint,2),32) + so.object_id tableid 
from 
    sys.objects so with (readpast) 
    inner join sys.schemas su with (readpast) on su.schema_id = so.schema_id 
    inner join sys.indexes i with (readpast) on so.object_id = i.object_id 
    inner join sys.partitions p with (readpast) ON i.object_id = p.object_id and i.index_id = p.index_id 
    inner join sys.allocation_units a with (readpast) on p.partition_id = a.container_id 
where 
    (so.type = 'U') and a.type_Desc = 'IN_ROW_DATA' 
    and isnull(INDEXPROPERTY(i.object_id, i.name, 'IsStatistics'),0) = 0 
    and isnull(INDEXPROPERTY(i.object_id, i.name, 'IsAutoStatistics'),0) = 0 
    and isnull(INDEXPROPERTY(i.object_id, i.name, 'IsHypothetical'),0) = 0     
order by 
    IndexKB desc 

select 
    i.QualifiedName, 
    i.IndexId, 
    i.FGName, 
    i.Type, 
    i.NumKeys, 
    i.IndexKB, 
    (i.UsedKB - isnull(t.s_UsedKB,0)) UsedKB, 
    (i.FreeKB - isnull(t.s_FreeKB,0)) FreeKB, 
    i.Rows, 
    i.RowModCtr, 
    i.OrigFillFactor  
from 
    @indexes i 
left outer join ( 
     select tableid, sum(UsedKB) s_UsedKB, sum(FreeKB) s_FreeKB 
     from @indexes 
     where IndexId > 1 
     group by tableid 
) t on t.tableid = i.tableid 
     and i.IndexId <= 1 
order by 
    IndexKB desc 
+0

うーん...私を少し混乱させるものの数。申し訳ありませんが、noobのように聞こえますが、SQL Serverを初めて使用しています。残っている合計テーブルスペースの割合が欲しいだけです。上記のVikramの答えがそのトリックを行うかどうか、任意のアイデア? – LittleLebowski

+0

@deathfarg固定サイズのデータ​​ベースファイルを持っていない場合、「残っている合計テーブルスペースの割合」はありません。私が理解したように、あなたはテーブルで占められている総スペースを望んでいます - そして、はい - Vikramの答えが良くなります、 –

+0

大丈夫、ありがとう。あなたはそれを正しいと思っています...私はテーブルが占有しているスペース全体が必要です。しかし、それはまた私に不思議に思っていました。次に、総DB領域を見つける方法は?そこにもprocはありますか? – LittleLebowski

3

は何が必要このです:

EXEC sp_spaceused null, false 

結果:

database_name database_size  unallocated space 
--------------- ------------------ ------------------ 
DATABASE_NAME 220.25 MB   69.92 MB 

reserved   data    index_size   unused 
------------------ ------------------ ------------------ ------------------ 
110672 KB   80368 KB   26944 KB   3360 KB 
+0

それは単純で甘いようです。私はそれを試してみましょう。 – LittleLebowski

関連する問題