Azure Synapse Studio查询索引碎片报错:DB_ID附近语法不正确
解决Azure Synapse Studio中索引碎片查询报错的问题
报错原因
你使用的sys.dm_db_index_physical_stats是SQL Server原生动态管理视图,Azure Synapse SQL池(专用/无服务器)均不支持该视图,且参数中的DB_ID()调用方式在Synapse架构下不兼容,这是触发语法错误的核心原因。
针对不同Synapse SQL池的解决方案
1. 专用SQL池(原数据仓库)
专用SQL池采用分布式架构,需使用节点级动态管理视图查询索引碎片,可用语句如下:
SELECT DB_NAME() AS DatabaseName, OBJECT_NAME(p.object_id) AS TableName, i.name AS IndexName, ips.avg_fragmentation_in_percent, ips.pdw_node_id FROM sys.dm_pdw_nodes_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips INNER JOIN sys.pdw_nodes_indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id AND ips.pdw_node_id = i.pdw_node_id INNER JOIN sys.pdw_index_mappings pm ON i.object_id = pm.object_id AND i.index_id = pm.index_id INNER JOIN sys.tables p ON pm.physical_name = p.name WHERE OBJECT_NAME(p.object_id) NOT LIKE '%.%' ORDER BY TableName, IndexName, ips.pdw_node_id;
- 说明:专用池数据分散在多节点,需通过
sys.pdw_nodes_db_index_physical_stats获取各节点索引碎片,再通过sys.pdw_index_mappings关联逻辑表与节点物理表。
2. 无服务器SQL池
无服务器SQL池不支持用户创建自定义索引(外部表的聚集列存储索引由系统自动管理,无需手动维护碎片),因此查询索引碎片的操作无实际意义,无需执行此类语句。
额外注意事项
- 在Synapse Studio执行查询前,需确认当前连接的是专用SQL池还是无服务器SQL池,两者系统视图集差异极大。
- 专用SQL池的索引碎片维护逻辑与SQL Server不同,仅需针对高频查询的大表整理碎片,推荐使用
ALTER INDEX REORGANIZE(部分场景不支持REBUILD)。
内容的提问来源于stack exchange,提问作者JaniH
相关产品推荐
相关产品推荐

