Mac*_*ver 30 sql-server-2008 sql-server disk-space
我们为一个应用程序总共使用了 6 个数据库,并且我们只能在所有 6 个自动增长数据库之间共享 4TB 的空间(通过 SAN 存储)。
我想为单个数据库编写一个查询(报告),指示 SQL Server Management Studio 中的任务 > 收缩 > 数据库选项下的“当前分配的空间”和“可用的可用空间”属性。
然后我想将这些数字转换为 TB 并对每个数据库进行总计,以粗略估计我们还剩下多少空间。可以通过 T-SQL 查询访问这些字段吗?如果是这样,查询会是什么样子?

Aar*_*and 42
以下是 Management Studio 用于填充这些数字的查询:
SELECT
(SELECT SUM(CAST(df.size as float)) FROM sys.database_files AS df
WHERE df.type in ( 0, 2, 4 ) ) AS [DbSize],
SUM(a.total_pages) AS [SpaceUsed],
(SELECT SUM(CAST(df.size as float)) FROM sys.database_files AS df
WHERE df.type in (1, 3)) AS [LogSize]
FROM
sys.partitions p join sys.allocation_units a
on p.partition_id = a.container_id
left join sys.internal_tables it
on p.object_id = it.object_id
Run Code Online (Sandbox Code Playgroud)
您需要在这里执行数学运算,就像 Management Studio 一样,以获得相同的数字。此外,左连接sys.internal_tables似乎充其量是多余的。因此,调整该查询以匹配您的理想输出:
SELECT
(SELECT CONVERT(DECIMAL(18,2), SUM(CAST(df.size as float))*8/1024.0)
FROM sys.database_files AS df
WHERE df.type in ( 0, 2, 4 ) ) AS [DbSize],
CONVERT(DECIMAL(18,2), SUM(a.total_pages)*8/1024.0) AS [SpaceUsed],
(SELECT CONVERT(DECIMAL(18,2), SUM(CAST(df.size as float))*8/1024.0)
FROM sys.database_files AS df
WHERE df.type in (1, 3)) AS [LogSize]
FROM sys.partitions p join sys.allocation_units a
on p.partition_id = a.container_id;
Run Code Online (Sandbox Code Playgroud)
有了这个更新,假设你的数据库在此期间没有改变,它应该产生:
753475.94 744030.07 2900.00
Run Code Online (Sandbox Code Playgroud)
做一些简单的数学运算,并仅隔离您想要的三个数字:
;WITH t(s) AS
(
SELECT CONVERT(DECIMAL(18,2), SUM(size)*8/1024.0)
FROM sys.database_files
WHERE [type] % 2 = 0
),
d(s) AS
(
SELECT CONVERT(DECIMAL(18,2), SUM(total_pages)*8/1024.0)
FROM sys.partitions AS p
INNER JOIN sys.allocation_units AS a
ON p.[partition_id] = a.container_id
)
SELECT
Allocated_Space = t.s,
Available_Space = t.s - d.s,
[Available_%] = CONVERT(DECIMAL(5,2), (t.s - d.s)*100.0/t.s)
FROM t CROSS APPLY d;
Run Code Online (Sandbox Code Playgroud)
Mik*_*Fal 24
Aaron 的查询很好,但作为替代,我使用 Glenn Berry 的DMV 查询中的这个查询
(您需要更改 TB 的数学):
-- Individual File Sizes and space available for current database
-- (Query 36) (File Sizes and Space)
SELECT f.name AS [File Name] , f.physical_name AS [Physical Name],
CAST((f.size/128.0) AS DECIMAL(15,2)) AS [Total Size in MB],
CAST(f.size/128.0 - CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS int)/128.0 AS DECIMAL(15,2))
AS [Available Space In MB], [file_id], fg.name AS [Filegroup Name]
FROM sys.database_files AS f WITH (NOLOCK)
LEFT OUTER JOIN sys.data_spaces AS fg WITH (NOLOCK)
ON f.data_space_id = fg.data_space_id OPTION (RECOMPILE);
Run Code Online (Sandbox Code Playgroud)
这里有一些可能对你有用的 SQL。
Create Table #dbInfo (dId smallint, dbName sysname, gId smallint NULL, segName varchar(256) NULL,
filName varchar(520) NULL, sizeMg decimal(10,2) null,
usedMg decimal(10,2) null, freeMg decimal(10,2) null,
pcntUsed decimal(10,2) null, pcntFree decimal(10,2) null)
Declare @sSql varchar(1000)
Set @sSql = 'Use [?];
Insert #dbInfo (dId, dbName, gid, segName, filName, sizeMg, usedMg)
Select db_id(), db_name(), groupid, rtrim(name), filename, Cast(size/128.0 As Decimal(10,2)),
Cast(Fileproperty(name, ''SpaceUsed'')/128.0 As Decimal(10,2))
From dbo.sysfiles Order By groupId Desc;'
Exec sp_MSforeachdb @sSql
Update #dbInfo Set
freeMg = sizeMg - usedMg,
pcntUsed = (usedMg/sizeMg)*100,
pcntFree = ((sizeMg-usedMg)/sizeMg)*100
select * from #dbInfo compute sum(sizeMG), sum(FreeMg)
drop table #dbInfo
Run Code Online (Sandbox Code Playgroud)
这是旧的 SQL,但仍然有效。其中一天我将重写它以使用 sys.database_files 就像 Aaron 的答案一样。
在解决了类似的问题(查询真实物理数据库文件大小)之后,我认为显示不同文件大小的查询,例如按日志和数据库分开,以及磁盘上文件的大小对大多数用户会更有帮助。
这包括系统文件大小和它占用的磁盘空间,以及 SQL 文件大小、使用的 SQL 空间以及扩展的 SQL 可用空间。它包括正在评估的文件的完整路径。如果使用不同于默认值(4096 字节)的分配大小来格式化磁盘,则用户需要更改“Size_On_Disk_Bytes”的计算。
SELECT fg.data_space_id AS FGID,
(f.file_id) AS File_Id,
-- As provided by OP, size on disk in bytes.
REPLACE(CONVERT(VARCHAR,CONVERT(MONEY, CAST(f.size AS FLOAT) * 8.00 * 1024), 1), '.00','') AS Size_On_Disk_Bytes,
ROUND((CAST(f.size AS FLOAT) * 8.00/1024)/1024,3) AS Actual_File_Size,
ROUND(CAST((f.size) AS FLOAT)/128,2) AS Reserved_MB,
ROUND(CAST((FILEPROPERTY(f.name,'SpaceUsed')) AS FLOAT)/128,2) AS Used_MB,
ROUND((CAST((f.size) AS FLOAT)/128)-(CAST((FILEPROPERTY(f.name,'SpaceUsed'))AS FLOAT)/128),2) AS Free_MB,
f.name,
f.physical_name
FROM sys.database_files f
LEFT JOIN sys.filegroups fg
ON f.data_space_id = fg.data_space_id
Run Code Online (Sandbox Code Playgroud)
此外,此查询将返回有关承载文件的卷驱动器空间的信息。用户将需要有权访问 sys.master_files。
SELECT DISTINCT dovs.logical_volume_name AS LogicalName,
dovs.volume_mount_point AS Drive,
CONVERT(INT,dovs.available_bytes/1048576.0) AS FreeSpaceInMB
FROM sys.master_files mf
CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.FILE_ID) dovs
ORDER BY FreeSpaceInMB ASC
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
131904 次 |
| 最近记录: |