CTE 允许将复杂的 SQL 查询模块化,从而提高可读性和实现物化。PostgreSQL 17 会传播来自物化 CTE 的统计信息,从而改进查询规划。然而,当与运行时随机性和数据倾斜结合时,这可能导致性能问题。数据倾斜是指列中值的分布不均匀,进而影响查询性能。原始包含"HIGH_RISK"账户的查询使用了两个物化 CTE。PostgreSQL 14 采用保守的规划策略,实现了快速的查询执行。PostgreSQL 17 凭借改进的统计信息,选择了一个效率低下的执行计划,导致执行时间极慢。该问题的根源在于规划器针对估计的大结果集进行优化,而非针对实际的小结果集。禁用哈希连接会强制使用嵌套循环,从而提升性能,但这并非切实可行的解决方案。插入带有`OFFSET 0`的`LATERAL`连接重构了查询。此举强制使用索引扫描,带来了显著的性能提升,效果类似于版本 14 的行为。
techcommunity.microsoft.com
When PostgreSQL v17 Chooses the Wrong Plan: A Deep Dive into CTEs with Data Skew
Create attached notes ...
