下面的查询使用 row_number(),并且在执行查询时引入了随机移动。
SELECT
f.col1
,f.col2
,f.col3
,f.col4
,rowNum=row_number() OVER (PARTITION BY f.col2 ORDER BY f.col4 desc)
FROM #currentData e
left join dbo.targetTable f on
e.col2 =f.col2
#currentData临时表和targetTable都分布在col2列上。 我还在 row_number() -- (col2 asc,col4 desc) 中使用的列上创建了索引,但它并没有摆脱随机移动。
我尝试创建一个覆盖索引来覆盖 select 语句中的所有列和 row_number 中的列,但这也没有解决问题。
两个表在连接列 (col2) 上都有索引。
还确保这两个表的统计数据是最新的。
由于随机移动,查询需要很长时间才能处理,是否有其他方法可以提高以下查询性能?
感谢您的帮助!
最佳答案
不幸的是,我刚刚发现了这一点。我没有时间完全理解,但通过删除 ROW_NUMBER 函数,我设法将查询性能降低了 90%。
据我了解,ROW_NUMBER 引入了每个节点应该拥有所有数据才能根据 order by 子句计算 row_number 的必要性。如果排序依据(或分区)源自一个大表,那么就会发生大量的洗牌。因为我们使用 row_number 作为主键生成器,所以我能够摆脱它,但我认为这也可能发生在排名等上。
通过删除 row_number,查询计划实际上执行了它应该执行的操作。无需移动数据即可加入。
有兴趣看看是否有人有解决方案或更好的解释。
关于azure - 在 Azure Synapse Analytics 专用 SQL 池中使用 row_number() 提高查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73409685/