SQL-скрипт для определения размера таблиц
Так как статья про статистику использования индексов (читать здесь) пользуется популярностью, выложу еще один скрипт. Он показывает списком перечень всех таблиц с размерами данных и индексов.
Работает на текущей базе.
Работает даже на SQL Server 2000.
Интересная для анализа вещь:
DECLARE @pagesizeKB INT
SELECT @pagesizeKB = low / 1024
FROM master.dbo.spt_values
WHERE NUMBER = 1 AND TYPE = 'E'
SELECT
TABLE_NAME = OBJECT_NAME(o.id),
ROWS = i1.rowcnt,
reservedMB = (ISNULL(SUM(i1.reserved), 0) + ISNULL(SUM(i2.reserved), 0)) * @pagesizeKB/1024,
dataMB = (ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0)) * @pagesizeKB/1024,
index_sizeMB = ((ISNULL(SUM(i1.used), 0) + ISNULL(SUM(i2.used), 0))
- (ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0))) * @pagesizeKB/1024,
unusedMB = ((ISNULL(SUM(i1.reserved), 0) + ISNULL(SUM(i2.reserved), 0))
- (ISNULL(SUM(i1.used), 0) + ISNULL(SUM(i2.used), 0))) * @pagesizeKB/1024
FROM sysobjects o
LEFT OUTER JOIN sysindexes i1
ON i1.id = o.id AND i1.indid < 2
LEFT OUTER JOIN sysindexes i2
ON i2.id = o.id AND i2.indid = 255
WHERE OBJECTPROPERTY(o.id, N'IsUserTable') = 1 --same as: o.xtype = 'IsView'
OR (OBJECTPROPERTY(o.id, N'IsView') = 1 AND OBJECTPROPERTY(o.id, N'IsIndexed') = 1)
GROUP BY o.id, i1.rowcnt
ORDER BY
--(ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0)) * @pagesizeKB desc --3 DESC
--i1.rowcnt desc
dataMB DESC
SELECT @pagesizeKB = low / 1024
FROM master.dbo.spt_values
WHERE NUMBER = 1 AND TYPE = 'E'
SELECT
TABLE_NAME = OBJECT_NAME(o.id),
ROWS = i1.rowcnt,
reservedMB = (ISNULL(SUM(i1.reserved), 0) + ISNULL(SUM(i2.reserved), 0)) * @pagesizeKB/1024,
dataMB = (ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0)) * @pagesizeKB/1024,
index_sizeMB = ((ISNULL(SUM(i1.used), 0) + ISNULL(SUM(i2.used), 0))
- (ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0))) * @pagesizeKB/1024,
unusedMB = ((ISNULL(SUM(i1.reserved), 0) + ISNULL(SUM(i2.reserved), 0))
- (ISNULL(SUM(i1.used), 0) + ISNULL(SUM(i2.used), 0))) * @pagesizeKB/1024
FROM sysobjects o
LEFT OUTER JOIN sysindexes i1
ON i1.id = o.id AND i1.indid < 2
LEFT OUTER JOIN sysindexes i2
ON i2.id = o.id AND i2.indid = 255
WHERE OBJECTPROPERTY(o.id, N'IsUserTable') = 1 --same as: o.xtype = 'IsView'
OR (OBJECTPROPERTY(o.id, N'IsView') = 1 AND OBJECTPROPERTY(o.id, N'IsIndexed') = 1)
GROUP BY o.id, i1.rowcnt
ORDER BY
--(ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0)) * @pagesizeKB desc --3 DESC
--i1.rowcnt desc
dataMB DESC

Автор: Андрей Стрельников
В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.
Количество статей, опубликованных автором: 86.
Скрипт выдает не верные результаты. Например, если в таблице есть поля BLOB — размер в мб равен 0.