Q:如何在sql池中放置表查询提示?他们似乎没有被认出来?
我们有一个synapse专用sql池,其中包含多个表,我们在查询和函数中连接这些表。
模式已经优化,大多数表的连接与哈希分布保持一致。由于这个原因,简单查询真的非常快,因为大多数连接都是在单个节点上完成的。
不幸的是,一些sql查询导致查询优化器故障,以不正确的方式连接,导致速度下降近10倍。
我们已经尝试了多种方法来使用各种"提示"来指定要使用的连接索引。例如with (index = XXXX)和with (index(XXXXX))和option(…),但是专用sql池似乎不能识别任何表查询提示并返回错误。
如果我们不解决这个问题,那么专用sql池非常不适合我们的业务领域。
(很奇怪的是,在这方面没有实际的最新文档-sql池甚至没有几乎实现t-sql规范,所以奇怪的是,实际实现的文档似乎不存在?)
任何帮助得到索引提示工作非常感谢!
编辑-一些背景信息-但请记住-我们在寻找如何获得提示工作的信息:
简而言之-我们有两个主要的表-一个保存每日来源的信息,另一个是多天的属性查找。
基本查询如下:
select d.*, mp.* from Daily d
inner join MultiDayProperties mp on (mp.id = d.propertyid)
where d.reportDate = '20210914' and....
两个表都是hash分布在mp上。p.id和p. propertyid,并在d.reportDate和mp.id上附加表索引。
通常情况下,查询Daily表的reportDate,并且Daily条目与它们的MultiDayProperties表查找连接在一起—这证明非常快,因为两个条目都在同一个节点中。
然而,当进一步限制查询MultiDayProperties时,例:"和;Param1 ='abc'和mp.param2='cde'",那么我们实际上是在(巨大的)MultiDayProperties表上进行表扫描,然后将得到的超集id广播到Daily表。(要慢10倍)
这种情况我已经解决了正常的SQL Server使用适当的查询提示,但是我没有能够做到这与Synapse SQL池。
总之-我只是在帮助与SQL池表查询提示:
SqlServer允许表查询提示-如何可能使用这样的表查询提示与SQL池?
Ok so -在尝试了一些事情之后,发现在出现问题的情况下,在查询结束时添加以下内容修复了问题:
OPTION (USE HINT ('ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'));
这阻止了出错情况下的ShuffleMoveOperation风暴。
提示:ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS,ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES似乎也有帮助(尽管不如MIN_SELECTIVITY)