Как определить, какие таблицы занимают больше всего места в базе данных SQL Server 2005? - PullRequest
79 голосов
/ 13 октября 2010

Как определить, какие таблицы занимают больше всего места в базе данных SQL Server 2005?

Я уверен, что есть некоторая системная хранимая процедура, которая показывает эту информацию.

У меня есть база данных TEST, которая выросла с 1 ТБ до 23 ТБ. В настоящее время мы проводим большое количество тестов конверсии клиентов в базе данных, что влечет за собой многократное выполнение одной и той же хранимой процедуры конверсии. Он удаляет, что, я уверен, увеличивает журнал транзакций. Но это заставило меня задуматься, чтобы задать этот вопрос.

информация

большая проблема - таблица dbo.Download, она создает огромное хранилище, которое на самом деле не нужно, у меня было 3 ГБ до его усечения, затем 52 МБ;)

Ответы [ 4 ]

185 голосов
/ 13 октября 2010

Попробуйте этот скрипт - в нем будет указано количество строк и пространство, используемое строками данных (и общее используемое пространство) для всех таблиц в вашей базе данных:

SELECT 
 t.NAME AS TableName,
 i.name AS indexName,
 SUM(p.rows) AS RowCounts,
 SUM(a.total_pages) AS TotalPages, 
 SUM(a.used_pages) AS UsedPages, 
 SUM(a.data_pages) AS DataPages,
 (SUM(a.total_pages) * 8) / 1024 AS TotalSpaceMB, 
 (SUM(a.used_pages) * 8) / 1024 AS UsedSpaceMB, 
 (SUM(a.data_pages) * 8) / 1024 AS DataSpaceMB
FROM 
 sys.tables t
INNER JOIN  
 sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
 sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
 sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
 t.NAME NOT LIKE 'dt%' AND
 i.OBJECT_ID > 255 AND  
 i.index_id <= 1
GROUP BY 
 t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
 OBJECT_NAME(i.object_id) 
31 голосов
/ 13 октября 2010

Использование sp_spacedUsed

Exec sp_spaceused N'YourTableName'

Или, если вы хотите выполнить sp_spaceused для каждой таблицы в вашей базе данных, вы можете использовать этот SQL:

set nocount on
create table #spaceused (
  name nvarchar(120),
  rows char(11),
  reserved varchar(18),
  data varchar(18),
  index_size varchar(18),
  unused varchar(18)
)

declare Tables cursor for
  select name
  from sysobjects where type='U'
  order by name asc

OPEN Tables
DECLARE @table varchar(128)

FETCH NEXT FROM Tables INTO @table

WHILE @@FETCH_STATUS = 0
BEGIN
  insert into #spaceused exec sp_spaceused @table
  FETCH NEXT FROM Tables INTO @table
END

CLOSE Tables
DEALLOCATE Tables 

select * from #spaceused
drop table #spaceused

exec sp_spaceused

Приведенный выше SQL взят из здесь

7 голосов
/ 07 марта 2018

Комментарий Rossisdead ответил на этот вопрос лучше всего для меня, я хотел бы, чтобы он не был скрыт в комментарии.Это будет полезно для таких людей, как я, которые не пытаются составить сценарий решения (операционная система не запрашивала фрагмент кода)

Если вы используете Management Studio, вы также можетещелкните правой кнопкой мыши базу данных и перейдите в Отчеты -> Использование диска по таблице для тех же результатов

2 голосов
/ 11 декабря 2018

Спасибо @marc_s за ответ.Мне нужно было знать данные в сравнении с индексным пространством, поэтому я пошел дальше и расширил запрос, включив его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...