Azure Synapse Analytics SQL on-demand查询Spark同步分区表性能过慢
解决方案
请按以下步骤检查配置,完成后即可触发SQL on-demand(无服务器SQL池)的分区裁剪能力:
- 确认使用共享元数据库
创建Spark表时必须使用Synapse工作区的共享元数据库,而非Spark池自带的本地default库。只有共享库的元数据会自动同步到无服务器SQL池,本地库的分区信息无法被无服务器SQL池识别。 - 同步分区元数据
Spark新增分区或创建分区表后,需要在无服务器SQL池中执行命令同步分区元数据:
无服务器SQL池不会自动同步Spark侧新增的分区元数据,未同步的情况下会全量扫描所有存储文件,导致性能极差。MSCK REPAIR TABLE 你的表名; - 避免分区列隐式转换或函数嵌套
首先确认Spark建表时定义的分区列类型,和你查询时过滤用的参数类型完全一致,比如分区列是字符串类型的dt,过滤时必须加引号写dt = '20231001',不能写dt = 20231001触发隐式转换。
同时不能对分区列套函数做过滤,比如year(dt) = 2023无法触发分区裁剪,必须直接对分区列本身做范围/等值过滤。 - 检查存储访问权限
确认Synapse工作区的托管身份对ADLS Gen2的存储账户根路径拥有存储Blob数据读者及以上权限,权限不足会导致分区扫描卡住,出现任务无法完成的情况。
如果按以上步骤配置后仍有问题,可以在无服务器SQL池中执行EXPLAIN 你的查询语句查看执行计划,确认计划里是否显示只扫描了目标分区的文件。
内容的提问来源于stack exchange,提问作者Sauron
相关产品推荐
相关产品推荐

