Cara menentukan ukuran tabel saya di database SQL Server

28

Apakah ada fungsi / prosedur tersimpan / kueri bawaan yang membantu untuk mengambil informasi tentang ukuran MyTabledalam database SQL Server?

Heisenberg
sumber
Jawaban pada SO ini memiliki skrip yang cukup sederhana dan tidak memerlukan prosedur tidak berdokumen.
Shawn Melton
Jawaban yang diberikan oleh AA.SC sangat berguna kecuali bahwa pengidentifikasi basis data msdb perlu dihapus dari semua DMVs dalam bergabung. Seperti berdiri itu hanya melaporkan pada tabel di msdb itu sendiri!
WaitForPete

Jawaban:

34

Untuk satu meja bisa Anda gunakan

sp_spaceused MyTable

Untuk semua tabel dalam database Anda dapat menggunakannya dengan sp_msforeachtablesebagai 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
aasim.abdullah
sumber
45

Jika Anda tidak ingin menulis skrip, Anda juga dapat membuka 'Rincian Penjelajah Objek' yang kurang digunakan di SSMS (tombol pintas F7).

Level Atas Rincian Penjelajah Objek

Dari Tingkat Atas, buka folder Tabel untuk mendapatkan daftar semua tabel di database Anda.

Anda mungkin perlu menyesuaikan kolom untuk melihat Ruang yang Digunakan. Ini dapat dilakukan dengan mengklik kanan pada baris header dan memilih kolom yang ingin Anda tampilkan.

Tabel ukuran data dalam SSMS

Ada banyak data seperti ini yang tersedia di Rincian Object Explorer.

Mark Sinkinson
sumber
3
Jauh lebih bagus daripada pendekatan t-sql di atas (yang tidak berhasil untuk saya)
Orion Edwards
17

Dalam SSMS klik kanan pada Database, pilih Laporan, Laporan Standar, Penggunaan Disk oleh Tabel Top.

Laporan akan memberi Anda jumlah baris dan kilobyte yang digunakan per tabel.

Pak Bersumpah banyak
sumber
2

Lihatlah sys.dm_db_partition_stats ( http://msdn.microsoft.com/en-us/library/ms187737.aspx ).

Ada beberapa pertanyaan sampel di tautan itu dan juga di http://blogs.msdn.com/b/cindygross/archive/2010/04/02/dmv-series-sys-dm-db-partition-stats.aspx

Anda dapat memodifikasi sesuai dengan kebutuhan Anda yaitu filter masuk / keluar indeks non-cluster. Lipat gandakan halaman dengan 8 untuk mendapatkan ukuran dalam KB, lalu bagi dengan 2 ^ 10 (= 1024) untuk dikonversi ke MB jika diperlukan.

sp_spaceused ( http://msdn.microsoft.com/en-us/library/ms188776.aspx ) juga akan memberikan informasi ukuran tabel.

Andy Jones
sumber
2

Untuk mendapatkan informasi ukuran tabel, saya ingin menggunakan skrip berikut

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  
AA.SC
sumber
1

Pergi ke basis data lalu klik kanan dan klik pada laporan lalu laporan standar lalu gunakan disk berdasarkan tabel. Ini akan memberi Anda semua file dalam database itu dan catatan mereka, data, indeks dll

SQLBen
sumber
0

Anda bisa menggunakan skrip berikut yang menghitung volume untuk setiap tabel dan kumpulan hasil lainnya dari total per basis data

    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
hkravitz
sumber