Liệt kê kích thước bảng cho tất cả các bảng trên tất cả các cơ sở dữ liệu


8

Có cách nào đơn giản để liệt kê kích thước của mỗi bảng trong mỗi cơ sở dữ liệu trên máy chủ MSSQL không?

Tôi đã sử dụng truy vấn trên sys.tables để nhận kết quả cho một cơ sở dữ liệu, nhưng chúng tôi có> 100 cơ sở dữ liệu trên mỗi máy chủ, vì vậy cách nhận được kết quả tương tự nhưng đối với tất cả các cơ sở dữ liệu sẽ rất tuyệt.

Hiện tại tôi phải tạo một danh sách cơ sở dữ liệu tạm thời từ cơ sở dữ liệu master.sys.dat, sau đó lặp lại bằng con trỏ, xây dựng truy vấn và chèn kết quả vào bảng tạm thời EXEC sp_executeSQL @SQLString.


Thông tin không gian đối tượng được lưu trữ trong cơ sở dữ liệu nơi đối tượng cư trú. Vì vậy, không có cách nào khác để lặp lại bằng cách sử dụng một danh sách các cơ sở dữ liệu. Phiên bản SQL Server nào bạn đang sử dụng?
Edward Pa-ri 20/12/13

@cylindric, một liên kết hữu ích ở đây
Biju jose

Câu trả lời:


6

Nếu bạn muốn có được điều này trên tất cả môi trường của mình, cho tất cả các cơ sở dữ liệu của bạn ... và bạn không phiền khi sử dụng PowerShell ... Bạn sẽ cần chạy nó từ một máy ít nhất đã cài đặt SQL Server 2008 Management Studio.


# 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}}
    }
}

Như được gắn nhãn DataSpaceUsedđầu ra đối tượng SMO trong "KB", bạn có thể sửa đổi đây thành phép đo mà bạn chọn bằng cách chỉ đưa tham chiếu viết tắt cho nó. Vì vậy, nếu tôi muốn "MB" : $_.DataSpaceUsed/1MB.

Trong hàm ([string[]]$server), dấu ngoặc "[]" có nghĩa là tham số chấp nhận một mảng các đối tượng. Vì vậy, nếu bạn có máy chủ của mình được liệt kê trong một tệp, bạn có thể gọi hàm như vậy:


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

Tôi thích sử dụng Out-GridViewban đầu để xem lại đầu ra và nó dễ dàng sao chép vào Excel cho tôi. Bạn cũng có thể xuất tệp này sang các định dạng được hỗ trợ khác của PowerShell nếu muốn.

Ví dụ với ảnh chụp màn hình, bạn cũng có thể liệt kê các máy chủ ra: nhập mô tả hình ảnh ở đây


Điều này có thể khá hoàn hảo. Tôi sẽ kiểm tra nó!
Hình trụ

Hoàn hảo, cảm ơn. Tôi chỉ phải thêm xác thực và nhận được các trường bổ sung mà tôi cần từ đối tượng Bảng technet.microsoft.com/en-us/l Library / cám
Hình trụ

5

Lấy từ Stack-Overflow: Nhận kích thước của tất cả các bảng trong cơ sở dữ liệu

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

1
Đó chính xác là những gì tôi đã có mà không làm những gì tôi cần - chỉ hiển thị một cơ sở dữ liệu.
Hình trụ

2

Tôi đã sử dụng kết hợp các câu trả lời trước:

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' ;

1

Bạn có thể thử sử dụng sp_msforeachdbtuy nhiên một vài cảnh báo với điều này.

Điều đó được nói rằng tôi đã sử dụng nó thành công trong vài năm nay.

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

Về cơ bản nó có một con trỏ và thay thế trên? với tên DB.

Bạn cũng có thể thử phiên bản thay thế của Aaron Bertrand. Tôi đã không tự mình thử nó nhưng nó được cho là tốt hơn.


0

Sau đây sẽ giải quyết câu hỏi của bạn:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.