我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
分享一篇网上的文章的翻译,原文连接见最后。
PostgreSQL 17新功能:IN子句转换
欢迎来到我们探索PostgreSQL 17官方版本中令人兴奋的新功能系列的第5部分。在本系列中,我们深入探讨新功能,并讨论它们如何使数据库开发者和迁移工程师在过渡到PostgreSQL最新版本时受益。
准备好提升您的PostgreSQL开发技能了吗?我的PostgreSQL和PL/pgSQL课程将帮助您掌握数据库开发。
PostgreSQL 17配备了令人印象深刻的自动优化和转换功能,与之前的版本相比显著提升了执行性能。其中一个突出的转换是对IN子句和相关查询的优化。
什么是相关查询?
相关查询是引用主查询中的值进行过滤的子查询。它的行为类似于嵌套循环,其中子访问路径为每个父行进行遍历。这使得优化子查询的访问方式变得至关重要,特别是如果它可以转换为连接操作。
让我们通过一个例子来了解PostgreSQL 17中相关查询的内部处理和转换是如何改进的。
PostgreSQL 17中相关IN子句转换为连接
我们将使用以下SQL代码片段来了解PostgreSQL 17中关于相关SQL和IN子句的新功能:
Drop table if exists test_in_correlated1,test_in_correlated2;
create table test_in_correlated1 (col1 bigint, col2 bigint, col3 text);
insert into test_in_correlated1 select col1, mod(col1,999) as col2 , col1::text as col3 from generate_series(1,10000) as col1;
create table test_in_correlated2 (col1 bigint, col2 bigint, col3 text);
insert into test_in_correlated2 select col1, mod(col1,999) as col2 , col1::text as col3 from generate_series(1,10000) as col1;
vacuum analyze test_in_correlated2,test_in_correlated1;
-- 测试SQL查询
explain (analyze, buffers) select * from test_in_correlated1 t1 where t1.col1 in (select t2.col1*99999 from test_in_correlated2 t2 where t1.col2= t2.col2);
通常,相关IN子句可以转换为EXISTS子句以获得更好的性能。但是,为了突出新功能,我们将坚持使用涉及相关行的IN子句。
PostgreSQL 17之前的执行计划
在早期版本中,相关IN子句的执行计划会选择SubPlan,为主查询返回的每一行进行评估——在我们的例子中是10,000行。在我们的示例中,相关子查询的访问模式将涉及顺序扫描(即全表扫描),因为过滤列没有索引。
PostgreSQL 17:相关IN子句的优化转换
在PostgreSQL 17中,相关IN子句被转换为更高效的连接选项。这种转换通过避免对非索引连接列进行未优化的嵌套访问路径来优化查询。
使用类似的数据集和表结构,您会注意到执行时间和缓冲区获取方面的显著改进。但是,请注意,这种转换仅适用于IN子句,不适用于NOT IN子句。
在我们的示例SQL中,执行时间从4607.39毫秒减少到30.379毫秒,无需任何更改,仅通过PostgreSQL 17中相关子查询的自动IN子句转换。
结论
PostgreSQL 17中的增强功能,特别是将相关IN子句自动转换为更高效的连接操作,展示了查询优化方面的持续改进。随着PostgreSQL的不断发展,看到这些进步将如何进一步优化数据库性能是令人兴奋的,使其成为开发者和企业的首选。如果您还没有探索PostgreSQL 17,现在是深入了解并利用这些强大新功能的好时机。
原文链接: Exploring PostgreSQL 17: A Developer’s Guide to New Features – Part 5 : Correlated IN Clause Transformation
——————作者介绍———————–
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)
PG新功能:PG 17引入IN子句转换:等您坐沙发呢!