2009-03-26 11 views
4

SQL Serverのエディション:/ SP3ワットSQL Server 2005および2008はどのようにテーブル格納情報を取得する

あり内蔵の以下の情報を取得するSQL Serverのストアドプロシージャ? DMV(Dynamic Management View)も同様に優れています。

私は主にテーブルのデータを見つける方法に興味がありますFILEGROUP特にテーブルのデータです。 しかし、次の結果をすべて返すsprocがあった方が良いでしょう。ところで

alt text

は、データSQL ServerのUIが表示さを取得する方法の1対1のマッチングを示す任意の文書がありますか?

答えて

5

システムストアドプロシージャsp_helpを使用するとよいでしょう。例えば

:これはトリック行う可能性があります

exec sp_help 'schema.TableName' 
+0

それだけです!私はテーブル上で "sp_help"を実行することについて考えたことはありません...それはFILEGROUPを表示します。 "Data_located_on_FileGroup"という名前になっています – Sung

+0

私は助けてくれるとうれしいです。 –

1

ファイルグループについては、DBCC showfilestatsまたはsp_spaceusedを参照してください。

blogにスクリプトがあります。それはテーブルとそのサイズをリストします。 ユーザーフレンドリー(管理ビューでは、DB上で右マウスを使用してレポートを生成できます)。

+0

申し訳ありませんが、それらはデシベルを示しました。 – Sascha

+0

スクリプトが見つかりました@ http://www.keyboardface.com/archives/2007/06/12/mssql-table-size-for-all-tables/ – Sascha

+0

@Sascha:私は、FILEGROUPの代わりにFILEGROUPを見つけることにもっと興味があります。ファイルサイズ... – Sung

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 
+0

@ck:申し訳ありませんが、このスクリプトは私にFILEGROUP情報を与えません。 – Sung

2

は解決策を見つけました。

テーブルFILEGROUP情報を見つけるためにUIを使用するよりも、これを入力する方が時間がかかるようです。 List tables in filegroupsで見つけた

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

は、私は代わりに、テーブル名を取り、別のストアドプロシージャを作成することになったこれらの3つの行を入力するのが面倒になりました。

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

あなたの2番目の質問に関しては、私はあなたがSSMSで詳細を表示するときただし、SQLプロファイラを使用することができ、任意のドキュメントがないと思います。これにより、正確なクエリが表示されます。

1

- >

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() 
関連する問題