azure - 在 Azure Synapse Analytics 专用 SQL 池中使用 row_number() 提高查询性能

标签 azure azure-synapse

下面的查询使用 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

enter image description here

#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/

相关文章:

azure - 为什么azure子网没有subnet.id参数

azure - 在 Azure SQL 数据仓库中提交后事务未完成

azure - 重命名表和列以及在突触池中传输架构

用于监听任何服务总线主题/订阅的azure函数

Azure VM 操作系统构建 - Powershell

azure - 为什么我可以连接到 Synapse 无服务器 SQL 池,但无法连接到同一 Synapse 工作区中的专用 SQL 池

azure-sql-database - Azure SQL DWH 日期分区

azure - 部署 SQL 数据仓库时出错

azure - 如何在 Azure 应用服务中创建虚拟目录并部署包

azure - Powershell - 在模块中找到命令,但无法加载模块