Shaw0xyz 发表于 2024-5-27 13:12:45

Sql Server中查询数据库所有表及其数据总条数和占用空间

在日常数据库管理中,了解数据库中各表的数据总条数和占用空间情况是非常重要的。这有助于优化数据库性能、进行容量规划和数据维护。本文将详细介绍如何在 Sql Server 中查询数据库所有表的数据总条数和占用空间。

1. 查询数据库所有表及其数据总条数

要查询数据库中所有表的数据总条数,我们可以利用系统视图 `sys.tables` 和 `sys.partitions` 以及聚合函数。以下是一个完整的 SQL 查询示例:


SELECT
    t.NAME AS TableName,
    p.rows AS RowCounts
FROM
    sys.tables t
INNER JOIN      
    sys.partitions p ON t.object_id = p.object_id
WHERE
    p.index_id IN (0, 1)
ORDER BY
    t.NAME;

1.1 解释

(1) `sys.tables`:包含数据库中所有表的基本信息。

(2) `sys.partitions`:包含每个表或索引的分区信息。

(3) `p.index_id IN (0, 1)`:过滤出表的数据分区(0 表示堆表,1 表示聚集索引表)。

(4) `p.rows`:表示表中的行数。

上述查询将返回数据库中所有表的名称及其行数。

2. 查询数据库所有表及其占用空间

为了获取数据库中所有表的占用空间信息,可以使用 `sys.dm_db_partition_stats` 和 `sys.tables` 系统视图。以下是一个完整的 SQL 查询示例:


SELECT
    t.NAME AS TableName,
    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
GROUP BY
    t.NAME
ORDER BY
    TotalSpaceKB DESC;


2.1 解释

(1) `sys.indexes`:包含每个表和视图的索引信息。

(2) `sys.partitions`:包含每个表或索引的分区信息。

(3) `sys.allocation_units`:包含每个分区或大对象数据的存储单元信息。

(4) `a.total_pages`:表示分配的总页数。

(5) `a.used_pages`:表示已使用的页数。

(6) 每个页的大小为 8KB,因此将页数乘以 8 得到空间大小(以 KB 为单位)。

上述查询将返回数据库中所有表的名称及其占用的总空间、已使用空间和未使用空间。

3. 综合查询:表的数据总条数和占用空间

为了同时获取表的数据总条数和占用空间,可以将上述两个查询结合起来。以下是一个完整的 SQL 查询示例:


SELECT
    t.NAME AS TableName,
    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
WHERE
    p.index_id IN (0, 1)
GROUP BY
    t.NAME, p.rows
ORDER BY
    TotalSpaceKB DESC;


3.1 解释

(1) 此查询结合了 `sys.tables`、`sys.indexes`、`sys.partitions` 和 `sys.allocation_units` 视图。

(2) `p.index_id IN (0, 1)`:过滤出表的数据分区,确保查询结果中仅包含表的主数据。

(3) 通过 `GROUP BY t.NAME, p.rows` 确保按表名和行数分组,并对每个表进行空间计算。

此查询将返回数据库中所有表的名称、行数、总空间、已使用空间和未使用空间,按总空间大小降序排列。

4. 总结

本文详细介绍了如何在 Sql Server 中查询数据库所有表及其数据总条数和占用空间。通过结合系统视图和聚合函数,可以轻松获取这些信息,从而更好地管理和优化数据库。希望本文能帮助您在实际项目中更高效地使用 Sql Server。

页: [1]
查看完整版本: Sql Server中查询数据库所有表及其数据总条数和占用空间