如何使用SSMS查询Dataverse表的索引大小?
查询Dataverse表的索引大小方法
因为Dataverse(原Dynamics 365 CE)底层数据库有特殊元数据结构,常规SQL索引大小查询语句需要适配其表命名规则和系统视图,以下是两种在SSMS中有效的查询方式:
方法一:使用sys.dm_db_index_physical_stats函数
该函数可返回索引的详细物理统计信息,包括占用空间大小:
SELECT OBJECT_NAME(s.object_id) AS 表名, i.name AS 索引名称, s.index_id AS 索引ID, CAST(s.total_page_count * 8 / 1024.0 AS DECIMAL(10,2)) AS 总大小(MB), CAST(s.used_page_count * 8 / 1024.0 AS DECIMAL(10,2)) AS 已使用大小(MB), CAST(s.data_pages * 8 / 1024.0 AS DECIMAL(10,2)) AS 数据页大小(MB) FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('SalesOrderBase'), NULL, NULL, 'DETAILED') s JOIN sys.indexes i ON s.object_id = i.object_id AND s.index_id = i.index_id ORDER BY 总大小(MB) DESC;
说明:
- 将
SalesOrderBase替换为目标实体对应的SQL表名:系统实体通常是[实体架构名]Base(比如SalesOrderDetailBase),自定义实体为new_[自定义实体名]Base DETAILED参数返回最详细统计,若追求速度可改为SAMPLING或LIMITED
方法二:通过系统视图关联计算
结合sys.indexes、sys.partitions和sys.allocation_units视图,汇总索引占用空间:
SELECT OBJECT_NAME(i.object_id) AS 表名, i.name AS 索引名称, i.index_id AS 索引ID, SUM(a.total_pages) * 8 / 1024.0 AS 总大小(MB), SUM(a.used_pages) * 8 / 1024.0 AS 已使用大小(MB), SUM(a.data_pages) * 8 / 1024.0 AS 数据页大小(MB) FROM sys.indexes i JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id JOIN sys.allocation_units a ON p.partition_id = a.container_id WHERE OBJECT_NAME(i.object_id) IN ('SalesOrderBase', 'SalesOrderDetailBase', 'new_你的自定义表Base') GROUP BY i.object_id, i.name, i.index_id ORDER BY 总大小(MB) DESC;
说明:
- 通过
IN子句可同时查询多个表的索引信息,方便对比系统表和自定义表 - 结果按索引大小降序排列,便于快速定位占用空间最大的索引
对比建议
若要对比系统表(含索引)和自定义表(无索引)的总占用:
- 对系统表,将所有索引的
总大小(MB)求和,再加上表的数据大小(可通过查询sys.tables结合sys.allocation_units获取) - 对自定义表,直接查询其数据大小即可,因为尚未生成索引
内容的提问来源于stack exchange,提问作者strattonn
相关产品推荐
相关产品推荐

