SELECT
t.name AS TableName,
s.name AS SchemaName,
SUM(a.total_pages) * 8 / 1024 AS TotalSpaceMB,
SUM(a.used_pages) * 8 / 1024 AS UsedSpaceMB,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 / 1024 AS UnusedSpaceMB
FROM
sys.tables t
INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
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
GROUP BY
t.name, s.name, p.rows
ORDER BY
TotalSpaceMB DESC;
这段SQL代码是一个查询语句,用于从数据库中检索表的名称、架构名称、总空间(以MB为单位)、已用空间(以MB为单位)和未使用空间(以MB为单位)。下面是对这段代码的逐行解释:
-
SELECT
:开始一个查询语句,选择要检索的列。 -
t.name AS TableName
:从sys.tables
表中选择name
列,并将其重命名为TableName
。 -
s.name AS SchemaName
:从sys.schemas
表中选择name
列,并将其重命名为SchemaName
。 -
SUM(a.total_pages) * 8 / 1024 AS TotalSpaceMB
:计算所有分配单元的total_pages
总和,乘以8(因为每页8KB),然后除以1024(将KB转换为MB),并重命名为TotalSpaceMB
。 -
SUM(a.used_pages) * 8 / 1024 AS UsedSpaceMB
:计算所有分配单元的used_pages
总和,乘以8,然后除以1024,重命名为UsedSpaceMB
。 -
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 / 1024 AS UnusedSpaceMB
:计算总页数减去已用页数的差值,乘以8,然后除以1024,重命名为UnusedSpaceMB
。 -
FROM sys.tables t
:指定查询的主要表是sys.tables
,别名为t
。 -
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
:通过schema_id
将sys.tables
表与sys.schemas
表进行内连接,以获取架构名称。 -
INNER JOIN sys.indexes i ON t.object_id = i.object_id
:通过object_id
将sys.tables
表与sys.indexes
表进行内连接,以获取索引信息。 -
INNER JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
:通过object_id
和index_id
将sys.indexes
表与sys.partitions
表进行内连接,以获取分区信息。 -
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
:通过partition_id
将sys.partitions
表与sys.allocation_units
表进行内连接,以获取分配单元信息。 -
GROUP BY t.name, s.name, p.rows
:按表名、架构名和行数进行分组。 -
ORDER BY TotalSpaceMB DESC
:按TotalSpaceMB
列的值降序排序结果