Як визначити розмір моїх таблиць у базі даних SQL Server


28

Чи є якась вбудована функція / збережена процедура / запит, яка корисна для отримання інформації про розмір MyTableбази даних SQL Server?


Ця відповідь на SO має сценарій, який досить простий і не вимагає бездокументованої процедури.
Шон Мелтон

Відповідь, надана AA.SC, є дуже корисною, за винятком того, що ідентифікатор бази даних msdb повинен бути видалений з усіх DMV в процесі з'єднання. На даний момент він повідомляє лише про таблиці в MSDB сам!
WaitForPete

Відповіді:


34

Для однієї таблиці ви можете використовувати

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

45

Якщо ви не хочете писати сценарій, ви також можете відкрити сильно використані "Інформація про дослідник об'єктів" у SSMS (клавіша швидкого доступу F7).

Найвищий рівень деталей про провідник об’єктів

Відкрийте папку «Таблиці» верхнього рівня, щоб отримати список усіх таблиць у вашій базі даних.

Можливо, вам доведеться налаштувати стовпці, щоб побачити простір, що використовується. Це можна зробити, клацнувши правою кнопкою миші на рядку заголовка та обравши стовпці, які потрібно відобразити.

Розмір даних таблиці в SSMS

Є ще багато подібних даних, доступних у "Деталі провідника".


3
Набагато приємніше, ніж t-sql підхід вище (який не працював для мене)
Orion Edwards

17

У SSMS клацніть правою кнопкою миші на базі даних, виберіть Звіти, Стандартні звіти, Використання диска за верхніми таблицями.

У звіті наведено кількість рядків та кілобайт, використаних у таблиці.


2

Погляньте на 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 ) також надасть інформацію про розмір таблиці.


2

Для отримання інформації про розмір таблиці мені подобається використовувати наступний скрипт

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  

1

Перейдіть до бази даних, потім клацніть правою кнопкою миші та клацніть на звіти, потім стандартні звіти, а потім використання диска за таблицею. Це дасть вам усі дані у цій базі даних та їх записи, дані, покажчики тощо


0

Ви можете використовувати наступний скрипт, який обчислює обсяг для кожної таблиці та інший набір результатів від загальної бази даних

    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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.