有什么方法可以找出数据库表的大小吗?

发布于 2024-07-21 00:19:58 字数 156 浏览 3 评论 0原文

我的 sql 2008 服务器中有大约 10 个表。

目前,我的 mdf 约为 3.5Gig。 (我在一些表中还有一些二进制数据)。 所以,我想知道是否有办法可以看到哪些桌子的尺寸最大。

这可能吗?

也许它是索引或 FTS 目录?

i've got around 10 tables in my sql 2008 server.

Currently, my mdf is around 3.5Gig. (I also have some binary data in some of the tables). So, I'm wondering if there's a way i could see which tables are the biggest in size.

Is this possible?

Maybe it's an index or FTS catalog instead?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

墨落画卷 2024-07-28 00:19:58

运行此:

/******************************************************************************
**    File: “GetTableSpaceUseage.sql”
**    Name: Get Table Space Useage for a specific schema
**    Auth: Robert C. Cain
**    Date: 01/27/2008
**
**    Desc: Calls the sp_spaceused proc for each table in a schema and returns
**        the Table Name, Number of Rows, and space used for each table.
**
**    Called by:
**     n/a – As needed
**
**    Input Parameters:
**     In the code check the value of @schemaname, if you need it for a
**     schema other than dbo be sure to change it.
**
**    Output Parameters:
**     NA
*******************************************************************************/

/*—————————————————————————*/
/* Drop the temp table if it's there from a previous run                     */
/*—————————————————————————*/
if object_id(N'tempdb..[#TableSizes]') is not null
  drop table #TableSizes ;
go

/*—————————————————————————*/
/* Create the temp table                                                     */
/*—————————————————————————*/
create table #TableSizes
  (
    [Table Name] nvarchar(128)   /* Name of the table */
  , [Number of Rows] char(11)    /* Number of rows existing in the table. */
  , [Reserved Space] varchar(18) /* Reserved space for table. */
  , [Data Space] varchar(18)    /* Amount of space used by data in table. */
  , [Index Size] varchar(18)    /* Amount of space used by indexes in table. */
  , [Unused Space] varchar(18)   /* Amount of space reserved but not used. */
  ) ;
go

/*—————————————————————————*/
/* Load the temp table                                                        */
/*—————————————————————————*/
declare @schemaname varchar(256) ;
-- Make sure to set next line to the Schema name you want!
set @schemaname = 'dbo' ;

-- Create a cursor to cycle through the names of each table in the schema
declare curSchemaTable cursor
  for select sys.schemas.name + '.' + sys.objects.name
      from    sys.objects
            , sys.schemas
      where   object_id > 100
              and sys.schemas.name = @schemaname
              /* For a specific table uncomment next line and supply name */
              --and sys.objects.name = 'specific-table-name-here'    
              and type_desc = 'USER_TABLE'
              and sys.objects.schema_id = sys.schemas.schema_id ;

open curSchemaTable ;
declare @name varchar(256) ;  /* This holds the name of the current table*/

-- Now loop thru the cursor, calling the sp_spaceused for each table
fetch curSchemaTable into @name ;
while ( @@FETCH_STATUS = 0 )
  begin    
    insert into #TableSizes
            exec sp_spaceused @objname = @name ;       
    fetch curSchemaTable into @name ;   
  end

/* Important to both close and deallocate! */
close curSchemaTable ;     
deallocate curSchemaTable ;


/*—————————————————————————*/
/* Feed the results back                                                     */
/*—————————————————————————*/
select [Table Name]
      , [Number of Rows]
      , [Reserved Space]
      , [Data Space]
      , [Index Size]
      , [Unused Space]
from    [#TableSizes]
order by [Table Name] ;

/*—————————————————————————*/
/* Remove the temp table                                                     */
/*—————————————————————————*/
drop table #TableSizes ;

采取来自 Robert Caine 博客

编辑了要解析的代码,单引号中的几个字符使用了特殊的单引号,以及 - 符号。

此代码适用于 Microsoft SQL 2005+

run this:

/******************************************************************************
**    File: “GetTableSpaceUseage.sql”
**    Name: Get Table Space Useage for a specific schema
**    Auth: Robert C. Cain
**    Date: 01/27/2008
**
**    Desc: Calls the sp_spaceused proc for each table in a schema and returns
**        the Table Name, Number of Rows, and space used for each table.
**
**    Called by:
**     n/a – As needed
**
**    Input Parameters:
**     In the code check the value of @schemaname, if you need it for a
**     schema other than dbo be sure to change it.
**
**    Output Parameters:
**     NA
*******************************************************************************/

/*—————————————————————————*/
/* Drop the temp table if it's there from a previous run                     */
/*—————————————————————————*/
if object_id(N'tempdb..[#TableSizes]') is not null
  drop table #TableSizes ;
go

/*—————————————————————————*/
/* Create the temp table                                                     */
/*—————————————————————————*/
create table #TableSizes
  (
    [Table Name] nvarchar(128)   /* Name of the table */
  , [Number of Rows] char(11)    /* Number of rows existing in the table. */
  , [Reserved Space] varchar(18) /* Reserved space for table. */
  , [Data Space] varchar(18)    /* Amount of space used by data in table. */
  , [Index Size] varchar(18)    /* Amount of space used by indexes in table. */
  , [Unused Space] varchar(18)   /* Amount of space reserved but not used. */
  ) ;
go

/*—————————————————————————*/
/* Load the temp table                                                        */
/*—————————————————————————*/
declare @schemaname varchar(256) ;
-- Make sure to set next line to the Schema name you want!
set @schemaname = 'dbo' ;

-- Create a cursor to cycle through the names of each table in the schema
declare curSchemaTable cursor
  for select sys.schemas.name + '.' + sys.objects.name
      from    sys.objects
            , sys.schemas
      where   object_id > 100
              and sys.schemas.name = @schemaname
              /* For a specific table uncomment next line and supply name */
              --and sys.objects.name = 'specific-table-name-here'    
              and type_desc = 'USER_TABLE'
              and sys.objects.schema_id = sys.schemas.schema_id ;

open curSchemaTable ;
declare @name varchar(256) ;  /* This holds the name of the current table*/

-- Now loop thru the cursor, calling the sp_spaceused for each table
fetch curSchemaTable into @name ;
while ( @@FETCH_STATUS = 0 )
  begin    
    insert into #TableSizes
            exec sp_spaceused @objname = @name ;       
    fetch curSchemaTable into @name ;   
  end

/* Important to both close and deallocate! */
close curSchemaTable ;     
deallocate curSchemaTable ;


/*—————————————————————————*/
/* Feed the results back                                                     */
/*—————————————————————————*/
select [Table Name]
      , [Number of Rows]
      , [Reserved Space]
      , [Data Space]
      , [Index Size]
      , [Unused Space]
from    [#TableSizes]
order by [Table Name] ;

/*—————————————————————————*/
/* Remove the temp table                                                     */
/*—————————————————————————*/
drop table #TableSizes ;

taken from Robert Caine blog

Edited the code to parse, several chars that were in single quote used a special single quote, as well the -- sign.

This code is for Microsoft SQL 2005+

梦里南柯 2024-07-28 00:19:58
exec sp_spaceused [tablename]
exec sp_spaceused [tablename]
在你怀里撒娇 2024-07-28 00:19:58

sys.allocations_units 包含您需要的信息。 您可以使用 sys.partitions 将分区的所有分配单元分组在一起并且还获得更有用的object_id而不是深奥的allocation_unit_id。

select object_name(p.object_id),
    sum(au.total_pages)*8 as [space_in_kb]
    from sys.partitions p
    join sys.allocation_units au on p.hobt_id = au.container_id
    group by p.object_id
    order by [space_in_kb]  desc

是的,所有表(堆或集群)都是“分区”,该术语并不指分区表。 sys.partitions 还具有您可能感兴趣的“行”列。

sys.allocations_units has the information you need. You join with sys.partitions to group all allocation units of a partition together and also to obtain the more usable object_id rather than the esoteric allocation_unit_id.

select object_name(p.object_id),
    sum(au.total_pages)*8 as [space_in_kb]
    from sys.partitions p
    join sys.allocation_units au on p.hobt_id = au.container_id
    group by p.object_id
    order by [space_in_kb]  desc

And yes, all tables (heap or clustered) are 'partitions', the terms does not refer to partitioned tables. sys.partitions also has the 'rows' column that may interest you.

烟火散人牵绊 2024-07-28 00:19:58
 exec sp_spaceused <tablename>
 exec sp_spaceused <tablename>
痕至 2024-07-28 00:19:58

在 SQL 2008+ 中:右键单击 SSMS 中的数据库名称,选择报告,然后选择标准报告,然后按表列出的磁盘使用情况

In SQL 2008+: right-click on the DB name in SSMS, select Reports, then Standard Reports, then Disk Usage by Table.

墟烟 2024-07-28 00:19:58

此查询显示当前数据库中每个表的大小。

SELECT sysobjects.[name] AS [TableName],
    SUM(sysindexes.reserved) * 8 AS [Size(KB)],
    SUM(sysindexes.dpages) * 8 AS [Data(KB)],
    (SUM(sysindexes.used) - SUM(sysindexes.dpages)) * 8 AS [Indexes(KB)],
    (SUM(sysindexes.reserved) - SUM(sysindexes.dpages)) * 8 AS [Unused(KB)]
FROM dbo.sysindexes AS sysindexes
    JOIN dbo.sysobjects AS sysobjects ON sysobjects.id = sysindexes.id
WHERE sysobjects.[type] = 'U'
GROUP BY sysobjects.[name]
ORDER BY [Size(KB)] DESC

This query shows the size of each table in the current database.

SELECT sysobjects.[name] AS [TableName],
    SUM(sysindexes.reserved) * 8 AS [Size(KB)],
    SUM(sysindexes.dpages) * 8 AS [Data(KB)],
    (SUM(sysindexes.used) - SUM(sysindexes.dpages)) * 8 AS [Indexes(KB)],
    (SUM(sysindexes.reserved) - SUM(sysindexes.dpages)) * 8 AS [Unused(KB)]
FROM dbo.sysindexes AS sysindexes
    JOIN dbo.sysobjects AS sysobjects ON sysobjects.id = sysindexes.id
WHERE sysobjects.[type] = 'U'
GROUP BY sysobjects.[name]
ORDER BY [Size(KB)] DESC
吹泡泡o 2024-07-28 00:19:58

有时我运行这个...它将所有表获取到临时表,循环它并获取所有表的大小。 结果数据在@tablesizes中,所以你可以按照你喜欢的方式查询它。

适用于 Sql Server >2005

declare @tables TABLE
(
    table_name nvarchar(200)
)

declare @tablesizes TABLE
(
    [name] nvarchar(200),
    [rows] int,
    reserved nvarchar(200),
    data nvarchar(200),
    index_size nvarchar(200),
    unused nvarchar(200),
    reserved_int int,
    data_int int,
    index_size_int int,
    unused_int int
)

declare @t nvarchar(200)

insert into @tables
select Table_Name from information_schema.tables

while exists(select * from @tables)
begin
    set @t=(select top 1 table_name from @tables)

    insert into @tablesizes([name],[rows],reserved,data,index_size,unused)
    exec sp_spaceused @t

    delete top (1) from @tables
end

update @tablesizes set 
reserved_int=convert(int, replace(reserved,' KB','')),
data_int=convert(int, replace(data,' KB','')),
index_size_int=convert(int, replace(index_size,' KB','')),
unused_int=convert(int, replace(unused,' KB',''))

select * from @tablesizes order by data_int desc

Sometimes I run this... It gets all tables to temp table, loops it through and gets sizes for all tables. Result data is in @tablesizes, so you can query it how you like.

Works in Sql Server >2005

declare @tables TABLE
(
    table_name nvarchar(200)
)

declare @tablesizes TABLE
(
    [name] nvarchar(200),
    [rows] int,
    reserved nvarchar(200),
    data nvarchar(200),
    index_size nvarchar(200),
    unused nvarchar(200),
    reserved_int int,
    data_int int,
    index_size_int int,
    unused_int int
)

declare @t nvarchar(200)

insert into @tables
select Table_Name from information_schema.tables

while exists(select * from @tables)
begin
    set @t=(select top 1 table_name from @tables)

    insert into @tablesizes([name],[rows],reserved,data,index_size,unused)
    exec sp_spaceused @t

    delete top (1) from @tables
end

update @tablesizes set 
reserved_int=convert(int, replace(reserved,' KB','')),
data_int=convert(int, replace(data,' KB','')),
index_size_int=convert(int, replace(index_size,' KB','')),
unused_int=convert(int, replace(unused,' KB',''))

select * from @tablesizes order by data_int desc
仙女山的月亮 2024-07-28 00:19:58

你可以使用:

SELECT @@servername;

IF EXISTS(SELECT name FROM tempdb.sys.tables WHERE name LIKE '#spaceUsed%')
    BEGIN
        DROP TABLE #spaceUsed;
    END;
CREATE TABLE #spaceUsed  (
name VARCHAR(255) ,
rows INT ,
reserved VARCHAR(50) ,
data VARCHAR(50) ,
index_size VARCHAR(50) ,
unused VARCHAR(50));

EXEC sp_msforeachtable
@command1 =' 
--
INSERT INTO #spaceUsed
exec sp_spaceused N''?'';
'
,@whereand = ' And Object_id In (Select Object_id From sys.objects
Where SCHEMA_NAME(Schema_ID) like ''%'')';

DECLARE
   @spaceUsedData TABLE  (
   name VARCHAR(255) ,
   rows INT ,
   reservedMB BIGINT NULL ,
   dataMB BIGINT NULL ,
   index_sizeMB BIGINT NULL ,
   unusedMB BIGINT NULL);

INSERT INTO INTO @spaceUsedData (name , rows , reservedMB , dataMB ,index_sizeMB ,unusedMB)
SELECT                  name , rows ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(reserved ,'KB' ,'')) ))/1024 ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(data ,'KB' ,'')) ))/1024 ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(index_size ,'KB' ,'')) ))/1024 ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(unused ,'KB' ,'')) ))/1024
FROM #spaceUsed;

SELECT * , reservedMB+  dataMB+index_sizeMB+unusedMB AS TotalMB FROM @spaceUsedData
ORDER BY rows DESC;

You could use:

SELECT @@servername;

IF EXISTS(SELECT name FROM tempdb.sys.tables WHERE name LIKE '#spaceUsed%')
    BEGIN
        DROP TABLE #spaceUsed;
    END;
CREATE TABLE #spaceUsed  (
name VARCHAR(255) ,
rows INT ,
reserved VARCHAR(50) ,
data VARCHAR(50) ,
index_size VARCHAR(50) ,
unused VARCHAR(50));

EXEC sp_msforeachtable
@command1 =' 
--
INSERT INTO #spaceUsed
exec sp_spaceused N''?'';
'
,@whereand = ' And Object_id In (Select Object_id From sys.objects
Where SCHEMA_NAME(Schema_ID) like ''%'')';

DECLARE
   @spaceUsedData TABLE  (
   name VARCHAR(255) ,
   rows INT ,
   reservedMB BIGINT NULL ,
   dataMB BIGINT NULL ,
   index_sizeMB BIGINT NULL ,
   unusedMB BIGINT NULL);

INSERT INTO INTO @spaceUsedData (name , rows , reservedMB , dataMB ,index_sizeMB ,unusedMB)
SELECT                  name , rows ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(reserved ,'KB' ,'')) ))/1024 ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(data ,'KB' ,'')) ))/1024 ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(index_size ,'KB' ,'')) ))/1024 ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(unused ,'KB' ,'')) ))/1024
FROM #spaceUsed;

SELECT * , reservedMB+  dataMB+index_sizeMB+unusedMB AS TotalMB FROM @spaceUsedData
ORDER BY rows DESC;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文