如何获取表存储信息

时间:2009-03-26 13:38:10

标签: sql-server sql-server-2005 sql-server-2008

SQL Server Edition :SQL Server 2005 w / SP3和2008

是否有内置的SQL Server存储过程可以检索以下信息? 或者DMV(动态管理视图)也会很棒。

我主要对如何具体查找表的 FILEGROUP 数据感兴趣。 但如果有一个sproc会返回以下所有结果,那就更好了。

alt text

顺便提一下,是否有任何文档显示如何检索SQL Server UI显示的数据的一对一匹配?

6 个答案:

答案 0 :(得分:5)

系统存储过程sp_help可能是一个很好的起点。

例如:

exec sp_help 'schema.TableName' 

答案 1 :(得分:2)

这将向您展示各种善良:

-- Script to analyze table space usage using the
-- output from the sp_spaceused stored procedure
-- Works with SQL 7.0, 2000, and 2005

set nocount on

print 'Show Size, Space Used, Unused Space, Type, and Name of all database files'

select
    [FileSizeMB]    =
        convert(numeric(10,2),sum(round(a.size/128.,2))),
        [UsedSpaceMB]   =
        convert(numeric(10,2),sum(round(fileproperty( a.name,'SpaceUsed')/128.,2))) ,
        [UnusedSpaceMB] =
        convert(numeric(10,2),sum(round((a.size-fileproperty( a.name,'SpaceUsed'))/128.,2))) ,
    [Type] =
        case when a.groupid is null then '' when a.groupid = 0 then 'Log' else 'Data' end,
    [DBFileName]    = isnull(a.name,'*** Total for all files ***')
from
    sysfiles a
group by
    groupid,
    a.name
    with rollup
having
    a.groupid is null or
    a.name is not null
order by
    case when a.groupid is null then 99 when a.groupid = 0 then 0 else 1 end,
    a.groupid,
    case when a.name is null then 99 else 0 end,
    a.name




create table #TABLE_SPACE_WORK
(
    TABLE_NAME  sysname     not null ,
    TABLE_ROWS  numeric(18,0)   not null ,
    RESERVED    varchar(50)     not null ,
    DATA        varchar(50)     not null ,
    INDEX_SIZE  varchar(50)     not null ,
    UNUSED      varchar(50)     not null ,
)

create table #TABLE_SPACE_USED
(
    Seq     int     not null    
    identity(1,1)   primary key clustered,
    TABLE_NAME  sysname     not null ,
    TABLE_ROWS  numeric(18,0)   not null ,
    RESERVED    varchar(50)     not null ,
    DATA        varchar(50)     not null ,
    INDEX_SIZE  varchar(50)     not null ,
    UNUSED      varchar(50)     not null ,
)

create table #TABLE_SPACE
(
    Seq     int     not null
    identity(1,1)   primary key clustered,
    TABLE_NAME  SYSNAME     not null ,
    TABLE_ROWS  int     not null ,
    RESERVED    int     not null ,
    DATA        int     not null ,
    INDEX_SIZE  int     not null ,
    UNUSED      int     not null ,
    USED_MB             numeric(18,4)   not null,
    USED_GB             numeric(18,4)   not null,
    AVERAGE_BYTES_PER_ROW       numeric(18,5)   null,
    AVERAGE_DATA_BYTES_PER_ROW  numeric(18,5)   null,
    AVERAGE_INDEX_BYTES_PER_ROW numeric(18,5)   null,
    AVERAGE_UNUSED_BYTES_PER_ROW    numeric(18,5)   null,
)

declare @fetch_status int

declare @proc   varchar(200)
select  @proc   = rtrim(db_name())+'.dbo.sp_spaceused'

declare Cur_Cursor cursor local
for
select
    TABLE_NAME  = 
    rtrim(TABLE_SCHEMA)+'.'+rtrim(TABLE_NAME)
from
    INFORMATION_SCHEMA.TABLES 
where
    TABLE_TYPE  = 'BASE TABLE'
order by
    1

open Cur_Cursor

declare @TABLE_NAME     varchar(200)

select @fetch_status = 0

while @fetch_status = 0
    begin

    fetch next from Cur_Cursor
    into
        @TABLE_NAME

    select @fetch_status = @@fetch_status

    if @fetch_status <> 0
        begin
        continue
        end

    truncate table #TABLE_SPACE_WORK

    insert into #TABLE_SPACE_WORK
        (
        TABLE_NAME,
        TABLE_ROWS,
        RESERVED,
        DATA,
        INDEX_SIZE,
        UNUSED
        )
    exec @proc @objname = 
        @TABLE_NAME ,@updateusage = 'true'


    -- Needed to work with SQL 7
    update #TABLE_SPACE_WORK
    set
        TABLE_NAME = @TABLE_NAME

    insert into #TABLE_SPACE_USED
        (
        TABLE_NAME,
        TABLE_ROWS,
        RESERVED,
        DATA,
        INDEX_SIZE,
        UNUSED
        )
    select
        TABLE_NAME,
        TABLE_ROWS,
        RESERVED,
        DATA,
        INDEX_SIZE,
        UNUSED
    from
        #TABLE_SPACE_WORK

    end     --While end

close Cur_Cursor

deallocate Cur_Cursor

insert into #TABLE_SPACE
    (
    TABLE_NAME,
    TABLE_ROWS,
    RESERVED,
    DATA,
    INDEX_SIZE,
    UNUSED,
    USED_MB,
    USED_GB,
    AVERAGE_BYTES_PER_ROW,
    AVERAGE_DATA_BYTES_PER_ROW,
    AVERAGE_INDEX_BYTES_PER_ROW,
    AVERAGE_UNUSED_BYTES_PER_ROW

    )
select
    TABLE_NAME,
    TABLE_ROWS,
    RESERVED,
    DATA,
    INDEX_SIZE,
    UNUSED,
    USED_MB         =
        round(convert(numeric(25,10),RESERVED)/
        convert(numeric(25,10),1024),4),
    USED_GB         =
        round(convert(numeric(25,10),RESERVED)/
        convert(numeric(25,10),1024*1024),4),
    AVERAGE_BYTES_PER_ROW   =
        case
        when TABLE_ROWS <> 0
        then round(
        (1024.000000*convert(numeric(25,10),RESERVED))/
        convert(numeric(25,10),TABLE_ROWS),5)
        else null
        end,
    AVERAGE_DATA_BYTES_PER_ROW  =
        case
        when TABLE_ROWS <> 0
        then round(
        (1024.000000*convert(numeric(25,10),DATA))/
        convert(numeric(25,10),TABLE_ROWS),5)
        else null
        end,
    AVERAGE_INDEX_BYTES_PER_ROW =
        case
        when TABLE_ROWS <> 0
        then round(
        (1024.000000*convert(numeric(25,10),INDEX_SIZE))/
        convert(numeric(25,10),TABLE_ROWS),5)
        else null
        end,
    AVERAGE_UNUSED_BYTES_PER_ROW    =
        case
        when TABLE_ROWS <> 0
        then round(
        (1024.000000*convert(numeric(25,10),UNUSED))/
        convert(numeric(25,10),TABLE_ROWS),5)
        else null
        end
from
    (
    select
        TABLE_NAME,
        TABLE_ROWS,
        RESERVED    = 
        convert(int,rtrim(replace(RESERVED,'KB',''))),
        DATA        = 
        convert(int,rtrim(replace(DATA,'KB',''))),
        INDEX_SIZE  = 
        convert(int,rtrim(replace(INDEX_SIZE,'KB',''))),
        UNUSED      = 
        convert(int,rtrim(replace(UNUSED,'KB','')))
    from
        #TABLE_SPACE_USED aa
    ) a
order by
    TABLE_NAME

print 'Show results in descending order by size in MB'

select * from #TABLE_SPACE order by USED_MB desc
go

drop table #TABLE_SPACE_WORK
drop table #TABLE_SPACE_USED 
drop table #TABLE_SPACE

答案 2 :(得分:2)

找到解决方案。

使用UI查找表格FILEGROUP信息似乎需要更长时间才能输入。

通过List tables in filegroups找到:

declare @objectid bigint
set @objectid = object_id('table_name')
exec sp_objectfilegroup @objectid

我变得懒得键入这三行,所以最终创建了另一个以表名取代的存储过程。

create procedure spTableFileGroup
    @TableName sysname
as
begin
    if exists(  select 1 
                from    INFORMATION_SCHEMA.TABLES T 
                where T.TABLE_NAME = @TableName) begin
        declare @objectid bigint
        set @objectid = object_id(@TableName)
        exec sp_objectfilegroup @objectid
    end
    else begin
        print 'There is no table named "' + @TableName + '"'
    end
end
GO

<强>用法

exec spTableFileGroup 'table_name'
GO

答案 3 :(得分:1)

查看DBCC showfilestats或sp_spaceused for filegroups。

blog找到一个脚本。列出了表格及其大小。 为了更加用户友好(管理视图,您可以在数据库上使用鼠标右键生成报告)。

答案 4 :(得分:1)

表格FILEGROUP由它的聚集索引决定。您可以使用此查询来查找文件组:

SELECT *
FROM
sys.tables AS tbl
INNER JOIN sys.indexes AS idx ON idx.object_id = tbl.object_id and idx.index_id < 2
LEFT OUTER JOIN sys.data_spaces AS dsidx ON dsidx.data_space_id = idx.data_space_id

关于第二个问题,我认为没有任何文档,但是,当您在SSMS中查看详细信息时,可以使用SQL事件探查器。这将显示确切的查询。

答案 5 :(得分:1)

这可能会起作用 - &gt;

use Your_database_name
GO

SELECT  FG.*, MF.* FROM sys.filegroups FG INNER JOIN sys.master_files
MF on MF.data_space_id = FG.data_space_id WHERE database_id = db_id()