Есть ли способ узнать размер / размеры таблиц вашей базы данных? - PullRequest
8 голосов
/ 27 мая 2009

У меня есть около 10 таблиц на моем сервере SQL 2008.

В настоящее время мой мдф составляет около 3,5 гигабайт. (У меня также есть некоторые двоичные данные в некоторых таблицах). Итак, мне интересно, есть ли способ узнать, какие таблицы имеют самый большой размер?

Возможно ли это?

Может быть, это индекс или каталог FTS?

Ответы [ 8 ]

11 голосов
/ 27 мая 2009

запустите это:

/******************************************************************************
**    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 ;

взято из Роберт Кейн блог

Отредактировал код для анализа, несколько символов в одинарных кавычках использовали специальную одинарную кавычку, а также знак -.

Этот код предназначен для Microsoft SQL 2005 +

6 голосов
/ 27 мая 2009

sys.allocations_units содержит необходимую информацию. Вы присоединяетесь к sys.partitions , чтобы сгруппировать все единицы размещения раздела вместе, а также получить более удобный для использования object_id, а не эзотерический alloc_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

И да, все таблицы (кучи или кластеризованные) являются partitions, термины не относятся к секционированным таблицам. У sys.partitions также есть столбец 'columns', который может вас заинтересовать.

6 голосов
/ 27 мая 2009
exec sp_spaceused [tablename]
5 голосов
/ 27 мая 2009
 exec sp_spaceused <tablename>
3 голосов
/ 07 апреля 2012

В SQL 2008+: щелкните правой кнопкой мыши имя БД в SSMS, выберите Reports, затем Standard Reports, затем Disk Usage by Table.

3 голосов
/ 30 мая 2009

Этот запрос показывает размер каждой таблицы в текущей базе данных.

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
2 голосов
/ 27 мая 2009

Иногда я запускаю это ... Он переводит все таблицы во временную таблицу, проходит по ней и получает размеры для всех таблиц. Данные результата находятся в @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
0 голосов
/ 07 июня 2014

Вы можете использовать:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...