Чи є якась вбудована функція / збережена процедура / запит, яка корисна для отримання інформації про розмір MyTable
бази даних SQL Server?
Чи є якась вбудована функція / збережена процедура / запит, яка корисна для отримання інформації про розмір MyTable
бази даних SQL Server?
Відповіді:
Для однієї таблиці ви можете використовувати
sp_spaceused MyTable
Для всіх таблиць у базі даних ви можете використовувати її sp_msforeachtable
як follwoing
CREATE TABLE #temp (
table_name sysname ,
row_count INT,
reserved_size VARCHAR(50),
data_size VARCHAR(50),
index_size VARCHAR(50),
unused_size VARCHAR(50))
SET NOCOUNT ON
INSERT #temp
EXEC sp_msforeachtable 'sp_spaceused ''?'''
SELECT a.table_name,
a.row_count,
COUNT(*) AS col_count,
a.data_size
FROM #temp a
INNER JOIN information_schema.columns b
ON a.table_name collate database_default
= b.table_name collate database_default
GROUP BY a.table_name, a.row_count, a.data_size
ORDER BY CAST(REPLACE(a.data_size, ' KB', '') AS integer) DESC
DROP TABLE #temp
Якщо ви не хочете писати сценарій, ви також можете відкрити сильно використані "Інформація про дослідник об'єктів" у SSMS (клавіша швидкого доступу F7).
Відкрийте папку «Таблиці» верхнього рівня, щоб отримати список усіх таблиць у вашій базі даних.
Можливо, вам доведеться налаштувати стовпці, щоб побачити простір, що використовується. Це можна зробити, клацнувши правою кнопкою миші на рядку заголовка та обравши стовпці, які потрібно відобразити.
Є ще багато подібних даних, доступних у "Деталі провідника".
У SSMS клацніть правою кнопкою миші на базі даних, виберіть Звіти, Стандартні звіти, Використання диска за верхніми таблицями.
У звіті наведено кількість рядків та кілобайт, використаних у таблиці.
Погляньте на sys.dm_db_partition_stats ( http://msdn.microsoft.com/en-us/library/ms187737.aspx ).
Деякі приклади запитів за цим посиланням, а також на http://blogs.msdn.com/b/cindygross/archive/2010/04/02/dmv-series-sys-dm-db-partition-stats.aspx
Ви можете змінювати відповідно до ваших потреб, тобто фільтрувати в / з некластеризованих індексів. Помножте кількість сторінок на 8, щоб отримати розмір у КБ, а потім розділіть на 2 ^ 10 (= 1024), щоб перетворити на МБ, якщо потрібно.
sp_spaceused ( http://msdn.microsoft.com/en-us/library/ms188776.aspx ) також надасть інформацію про розмір таблиці.
Для отримання інформації про розмір таблиці мені подобається використовувати наступний скрипт
SELECT sc.name + '.' + t.NAME AS TableName,
p.[Rows],
( SUM(a.total_pages) * 8 ) / 1024 AS TotalReservedSpaceMB, -- Number of total pages * 8KB size of each page in SQL Server
( SUM(a.used_pages) * 8 ) / 1024 AS UsedDataSpaceMB,
( SUM(a.data_pages) * 8 ) / 1024 AS FreeUnusedSpaceMB
FROM msdb.sys.tables t
INNER JOIN msdb.sys.schemas sc ON sc.schema_id = t.schema_id
INNER JOIN msdb.sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN msdb.sys.partitions p ON i.object_id = p.OBJECT_ID
AND i.index_id = p.index_id
INNER JOIN msdb.sys.allocation_units a ON p.partition_id = a.container_id
WHERE t.type_desc = 'USER_TABLE'
AND i.index_id <= 1 --- Heap\ CLUSTERED
AND t.NAME='MYTableName' -- Replace with valid table name
GROUP BY sc.name + '.' + t.NAME,
i.[object_id],i.index_id, i.name, p.[Rows]
ORDER BY ( SUM(a.total_pages) * 8 ) / 1024 DESC
Ви можете використовувати наступний скрипт, який обчислює обсяг для кожної таблиці та інший набір результатів від загальної бази даних
SET NOCOUNT ON
IF OBJECT_ID('tempdb..#SpaceUsed') IS NOT NULL DROP TABLE #SpaceUsed
CREATE TABLE #SpaceUsed
(
TableName sysname ,
[Rows] int ,
[Reserved] varchar(20),
[Data] varchar(20),
[Index_Size] varchar(20),
[Unused] varchar(20),
[Reserved_KB] bigint,
[Data_KB] bigint,
[Index_Size_KB] bigint,
[Unused_KB] bigint
)
DECLARE @CMD NVARCHAR(MAX) =''
SELECT @CMD +='EXEC sp_spaceused ' + ''''+QUOTENAME(TABLE_SCHEMA)+'.'+ QUOTENAME(TABLE_NAME)+''''+';'+CHAR(10)
FROM INFORMATION_SCHEMA.TABLES
--PRINT @CMD
INSERT INTO #SpaceUsed (TableName ,[Rows] , [Reserved], [Data] , [Index_Size] , [Unused] )
EXEC sp_executesql @CMD
UPDATE #SpaceUsed
SET [Reserved_KB] = CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Reserved] , ' KB', '')))),
[Data_KB] = CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Data] , ' KB', '')))),
[Index_Size_KB]= CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Index_Size] , ' KB', '')))),
[Unused_KB]= CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Unused] , ' KB', ''))))
SELECT TableName, [Rows], Reserved_KB , Data_KB , Index_Size_KB , Unused_KB , Data_KB / 1024.0 Data_MB , Data_KB / 1024.0 / 1024.0 Data_GB
FROM #SpaceUsed
ORDER BY Data_KB DESC
SELECT SUM(Reserved_KB) Reserved_KB , SUM(Data_KB) Data_KB, SUM(Index_Size_KB) Index_Size_KB , SUM(Unused_KB) Unused_KB ,SUM(Data_KB / 1024.0) Data_MB , SUM(Data_KB / 1024.0 / 1024.0) Data_GB
FROM #SpaceUsed
DROP TABLE #SpaceUsed