วิธีกำหนดขนาดของตารางของฉันในฐานข้อมูล SQL Server


28

มีฟังก์ชั่นในตัว / ขั้นตอนการจัดเก็บ / แบบสอบถามที่เป็นประโยชน์ในการดึงข้อมูลเกี่ยวกับขนาดของMyTableในฐานข้อมูล SQL Server หรือไม่?


คำตอบสำหรับ SOนี้มีสคริปต์ที่ค่อนข้างง่ายและไม่ต้องการขั้นตอนที่ไม่มีเอกสาร
Shawn Melton

คำตอบที่ได้รับจาก 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

หากคุณไม่ต้องการเขียนสคริปต์คุณสามารถเปิด 'Object Explorer Details' ใน SSMS (คีย์ลัด F7) ที่ไม่ได้ใช้งานได้

ระดับสูงสุดของรายละเอียด Object Explorer

จากระดับบนสุดให้เปิดโฟลเดอร์ Tables เพื่อรับรายการตารางทั้งหมดในฐานข้อมูลของคุณ

คุณอาจต้องปรับแต่งคอลัมน์เพื่อดู Space ที่ใช้ สามารถทำได้โดยคลิกขวาที่แถวส่วนหัวและเลือกคอลัมน์ที่คุณต้องการแสดง

ขนาดข้อมูลตารางใน SSMS

มีข้อมูลมากมายเช่นนี้ใน Object Explorer Details


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 เพื่อให้ได้ขนาดเป็น KB แล้วหารด้วย 2 ^ 10 (= 1024) เพื่อแปลงเป็น MB หากต้องการ

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.