Как найти общее использование табличного пространства в SQL Server 2008? - PullRequest
3 голосов
/ 24 февраля 2012

В SQL-server 2008, Как узнать (через запрос SQL) процент использования табличного пространства для конкретного экземпляра (или всех экземпляров) SQL Server (2008 R2)?

Кроме того, каков наилучший способ (запрос) для получения списка всех именованных экземпляров SQL Server?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2012

это то, что вам нужно:

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
2 голосов
/ 24 февраля 2012

Используйте скрипт:

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
...