Azure Synapse 专用SQL池如何使用表查询提示(Index Hints)
Azure Synapse 专用SQL池查询提示兼容方案
首先明确:Azure Synapse 专用SQL池原生不支持传统SQL Server中的表级索引提示(如with (index = XXX)写法),你遇到的优化器选错执行计划的问题,可通过以下专用SQL池兼容的方案解决:
- 第一步:校准统计信息
专用SQL池默认不会自动更新统计信息,优化器基数估计错误是绝大多数执行计划异常的根因。先执行全量统计信息更新,再验证执行计划:UPDATE STATISTICS Daily WITH FULLSCAN; UPDATE STATISTICS MultiDayProperties WITH FULLSCAN; - 第二步:使用合法的查询级提示
专用SQL池支持部分查询级提示,可强制join顺序和join类型,避免优化器选择广播连接:select d.*, mp.* from Daily d inner join MultiDayProperties mp on (mp.id = d.propertyid) where d.reportDate = '20210914' and mp.param1='abc' and mp.param2='cde' -- 以下为合法提示,强制按语句写的顺序join,且使用哈希join OPTION (FORCE ORDER, HASH JOIN); - 第三步:临时表预过滤强制分布规则
如果提示无效,可将过滤后的小表结果预存入和关联表分布键一致的临时表,从底层规则上避免跨节点数据移动,性能稳定性最高:-- 预过滤属性表,指定分布键和Daily表的关联字段匹配 CREATE TABLE #FilteredMP WITH (DISTRIBUTION = HASH(id)) AS SELECT id, param1, param2, [其余需要返回的字段] FROM MultiDayProperties WHERE param1='abc' AND param2='cde'; -- 两张表分布键一致,无数据移动,执行本地join SELECT d.*, fmp.* FROM Daily d INNER JOIN #FilteredMP fmp ON fmp.id = d.propertyid WHERE d.reportDate = '20210914';
补充说明:当前专用SQL池未提供表级索引提示的兼容语法,上述方案可完全覆盖你描述的场景,不需要使用传统SQL Server的索引提示写法。
内容的提问来源于stack exchange,提问作者Yolt
相关产品推荐
相关产品推荐

