【发布时间】:2021-11-09 10:34:17
【问题描述】:
问:如何将表查询提示放入 sql 池中?他们似乎没有被认出来?
我们有一个带有多个表的突触专用 sql 池,我们将这些表加入到我们的查询和函数中。
架构已经过优化,大多数表的连接与哈希分布一致。由于这个原因,简单的查询确实非常快,因为大多数连接都是在单个节点上完成的。
不幸的是,一些sql查询导致查询优化器出现故障,以不正确的方式连接,导致速度下降近10倍。
我们尝试了多种方法来使用各种“提示”来指定要使用的连接索引 例如with (index = XXXX) and with (index(XXXXX)) and option(...),但是专用的 sql 池似乎无法识别任何表查询提示并返回错误。
如果我们不解决这个问题,那么专用的 sql 池将非常不适合我们的业务领域。
(这也很奇怪,在这方面没有实际的最新文档 - sql 池甚至几乎没有实现它看起来的 t-sql 规范,所以奇怪的是实际实现似乎不存在文档? )
非常感谢您对索引提示的任何帮助!
编辑 - 一些背景信息 - 但请记住 - 我们正在了解如何让 HINTS 工作的信息:
简而言之 - 我们有 2 个主表 - 一个包含每日来源信息,另一个是多天属性查找。
基本查询是这样的:
select d.*, mp.* from Daily d
inner join MultiDayProperties mp on (mp.id = d.propertyid)
where d.reportDate = '20210914' and....
两个表都散列在 mp.id 和 d.propertyid 上,并在 d.reportDate 和 mp.id 上附加了一个表索引。
通常情况是查询 Daily 表以获取 reportDate,并且 Daily 条目与它们的 MultiDayProperties 表查找相连接 - 结果非常快,因为两个条目都在同一个节点中。
但是,当进一步限制 MultiDayProperties 上的查询时, 例如“和 mp.param1='abc' 和 mp.param2='cde'”, 然后我们实际上是在(巨大的)MultiDayProperties 表上进行表扫描,然后将生成的超集 ID 广播加入 Daily 表。 (慢 10 倍)
这种情况我已经使用正常的 SQL Server 使用适当的查询提示解决了,但是我无法使用 Synapse SQL 池做到这一点。
简而言之 - 我只是在获得 SQL POOLS 表查询提示的帮助后:
SqlServer 允许表查询提示 - 如何将此类表查询提示与 SQL POOLS 一起使用?
【问题讨论】:
-
您是否有未按预期执行的示例查询?所涉及的所有表的分布是什么?能否将 EXPLAIN 放在查询前面并包含查询的解释计划?
-
嗨 - 用更多信息更新了这个问题,谢谢
-
表是列存储还是聚集索引还是堆?自动创建统计是否开启? docs.microsoft.com/en-us/azure/synapse-analytics/sql/…
-
统计信息已开启,我们每天早上都会自动更新。我在这里寻求帮助的问题是如何在 SQL POOLS 上使用表查询提示(如在普通 sql server 中) - 因为它们似乎不受支持?
标签: azure-sql-database query-optimization azure-synapse