Daftar ukuran tabel untuk semua tabel di semua database

8

Apakah ada cara sederhana untuk membuat daftar ukuran setiap tabel di setiap database pada server MSSQL?

Saya telah menggunakan kueri pada sys.tables untuk mendapatkan hasil untuk satu basis data, tetapi kami memiliki> 100 basis data per server, jadi cara untuk mendapatkan hasil yang sama tetapi untuk semua basis data akan bagus.

Saat ini saya harus membuat daftar sementara database dari master.sys.databases, dan kemudian iterate dengan kursor, membangun kueri dan memasukkan hasilnya ke tabel temp sementara EXEC sp_executeSQL @SQLString.

Silindris
sumber
Informasi ruang objek disimpan dalam database tempat objek berada. Jadi tidak ada cara lain untuk beralih menggunakan daftar database. Versi SQL Server apa yang Anda gunakan?
Edward Dortland
@ silinder, tautan yang berguna di sini
Biju jose

Jawaban:

6

Jika Anda ingin mendapatkan ini di semua lingkungan Anda, untuk semua database Anda ... dan Anda tidak keberatan menggunakan PowerShell ... Anda perlu menjalankan ini dari mesin yang setidaknya memiliki SQL Server 2008 Management Studio diinstal.


# Load SMO
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null

function Get-TableSize ([string[]]$server) {
    foreach ($srv in $server) {
        $s = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $srv

        $s.Databases.Tables | 
            ? {-Not $_.IsSystemObject} | 
                Select @{Label="Server";Expression={$srv}},
                    @{Label="DatabaseName";Expression={$_.Parent}}, 
                    @{Label="TableName";Expression={$_.Name}}, 
                    @{Label="SizeKB";Expression={$_.DataSpaceUsed}}
    }
}

Seperti yang diberi label DataSpaceUsedkeluaran objek SMO di "KB", Anda dapat memodifikasi ini menjadi ukuran pilihan Anda dengan hanya meletakkan referensi singkat untuk itu. Jadi jika saya ingin "MB": $_.DataSpaceUsed/1MB.

Dalam fungsinya ([string[]]$server), tanda kurung "[]" berarti parameter menerima array objek. Jadi, jika server Anda terdaftar dalam file, Anda dapat memanggil fungsi seperti:


$list = get-content .\ServerList.txt
Get-TableSize -server $list | Out-GridView

Saya lebih suka menggunakan Out-GridViewawalnya untuk meninjau output, dan mudah menyalin langsung ke Excel untuk saya. Anda juga dapat menampilkan ini ke format PowerShell lain yang didukung jika diinginkan.

Contoh dengan tangkapan layar, Anda juga bisa daftar server keluar: masukkan deskripsi gambar di sini


sumber
Ini bisa sangat sempurna. Saya akan mengujinya!
Silinder
Sempurna terima kasih. Saya hanya perlu menambahkan otentikasi, dan mendapatkan bidang tambahan yang saya butuhkan dari objek Table technet.microsoft.com/en-us/library/…
Cylindric
5

Diambil dari Stack-Overflow: Dapatkan ukuran semua tabel dalam database

SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    t.Name
rolfl
sumber
1
Itu persis apa yang sudah saya miliki yang tidak melakukan apa yang saya butuhkan - itu hanya menunjukkan satu database.
Silinder
2

Saya menggunakan gabungan jawaban sebelumnya:

USE [master];
GO

sp_msforeachdb 'USE [?]; 
SELECT  
''?'' as db,    
t.NAME AS TableName,    
s.Name AS SchemaName,    
p.rows AS RowCounts,    
SUM(a.total_pages) * 8 AS TotalSpaceKB,     
SUM(a.used_pages) * 8 AS UsedSpaceKB, 
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB 
FROM     sys.tables t 
INNER JOIN      sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
INNER JOIN     sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN     sys.schemas s ON t.schema_id = s.schema_id 
WHERE    p.rows > 0 AND t.is_ms_shipped = 0    AND i.OBJECT_ID > 255 
GROUP BY     t.Name, s.Name, p.Rows 
ORDER BY p.rows DESC' ;
Fer R
sumber
1

Anda dapat mencoba menggunakan sp_msforeachdbbeberapa peringatan dengan ini.

Itu dikatakan saya telah menggunakannya dengan sukses selama beberapa tahun sekarang.

sp_msforeachdb 'USE [?]; SELECT * FROM sys.tables'

Pada dasarnya itu tidak kursor dan pengganti? dengan nama DB.

Anda juga dapat mencoba versi pengganti Aaron Bertrand. Saya belum mencobanya sendiri tetapi seharusnya lebih baik.

Kenneth Fisher
sumber
0

Berikut ini akan menyelesaikan pertanyaan Anda:

use master
DECLARE @xQry NVARCHAR(MAX)=''
SELECT @xQry+= ' UNION ALL SELECT '''+name+''' COLLATE Modern_Spanish_CI_AS AS [Database], 
    schema_name(tab.schema_id) + ''.'' + tab.name COLLATE Modern_Spanish_CI_AS AS [table], 
        cast(sum(spc.used_pages * 8)/1024.00 as numeric(36, 2)) as used_mb,
        cast(sum(spc.total_pages * 8)/1024.00 as numeric(36, 2)) as allocated_mb
    from '+name+'.sys.tables tab
    join '+name+'.sys.indexes ind 
         on tab.object_id = ind.object_id
    join '+name+'.sys.partitions part 
         on ind.object_id = part.object_id and ind.index_id = part.index_id
    join '+name+'.sys.allocation_units spc
         on part.partition_id = spc.container_id
    group by schema_name(tab.schema_id) + ''.'' + tab.name COLLATE Modern_Spanish_CI_AS'
FROM sys.databases 

SET @xQry= RIGHT(@xQry,LEN(@xQry)-11) + ' order by 3 desc'
EXEC (@xQry)
FMA
sumber