我知道这是一个重复的问题,但我已经尝试了 stackoverflow.com 上出现的每个可能问题中建议的所有解决方案和解决方法
我继承了一个专用的 SQL 池,SQL Server 版本为 2012.0.2000.8,上面有几个表。
我们希望了解我们应该设置多少保留,为此我们正在分析每个表的大小。
我试过了
- 按表显示数据和磁盘使用细分
- sys.allocation_units 和 sp_spaceused 上的空间使用情况
- 通过单击数据库右侧生成报告,但我在 SSMS 中没有该选项
试图写这个查询
SELECT
OBJECT_SCHEMA_NAME(p.object_id) + '.' + OBJECT_NAME(p.object_id) AS TableName,
SUM(p.rows) AS RowCounts,
CONVERT(DECIMAL,SUM(p.reserved_page_count)) * 8 / 1024 AS TotalSpaceMB,
CONVERT(DECIMAL,SUM(p.used_page_count)) * 8 / 1024 AS UsedSpaceMB ,
CONVERT(DECIMAL,SUM(p.reserved_page_count - p.used_page_count)) * 8 / 1024 AS
UnusedSpaceMB
FROM
sys.partitions p
WHERE
p.index_id <= 1
GROUP BY
p.object_id
ORDER BY
UsedSpaceMB DESC, TableName;
或者这个
SELECT
t.NAME AS TableName,
p.rows AS RowCounts,
CONVERT(DECIMAL,SUM(a.total_pages)) * 8 / 1024 / 1024 AS TotalSpaceGB,
SUM(a.used_pages) * 8 / 1024 / 1024 AS UsedSpaceGB ,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 / 1024 / 1024 AS UnusedSpaceGB
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 = 'mytable'
AND t.is_ms_shipped = 0
AND i.OBJECT_ID > 255
GROUP BY
t.Name, s.Name, p.Rows
ORDER BY
UsedSpaceGB DESC, t.Name
每次使用系统视图(sys.schemas / sys.partition / sys.allocation_units 等)时,它都会说
此版本不支持目录视图“X”。
我认为大多数情况下可能存在某些权限问题,因为我无法使用系统视图,它们应该存在于我的 SQL 池版本中。
所以,我的问题是,
我如何使用系统视图修复?
使用 DMV 时,您应该始终查找他们的文档,该文档在顶部列出了支持这些 DMV 的 Microsoft 产品。例如,你的第二个查询使用的
sys.allocation_units
是 Azure Synapse Analytics 不支持的。根据 Microsoft 员工 David Browne 在此帮助帖子中的说法,此查询(使用
sys.dm_pdw_nodes_db_partition_stats
*)可用于获取 Azure Synapse Analytics 中的数据库大小:完全开放地运行 DMV 将为您提供每个分区的大小细分,其中包括每个表和索引,如下所示:
然后,您应该能够对其进行分组,
object_id
以从根本上获取每个表对象的总大小:*请注意,如文档中所述,这
sys.dm_pdw_nodes_db_partition_stats
是 DMV 的 Azure Synapse Analytics 版本。sys.dm_db_partition_stats