#RuPostgres会议的材料-视频,演示,测验分析和照片报告

9月15日,在Avito举行了一次会议,我们讨论了在PostgreSQL上扩展应用程序。 今天,我想分享他的材料-视频,演讲者的演讲,照片。 另外,在削减后,我在三叉戟之前发布了我们在哈布雷(Habré)进行的测验问题的讨论。 我谈论我对会议的印象。



报告书


分布式交易和时间旅行。 Stas Kelvich,Postgres专业人士


Stas谈到了分布式事务和时间旅行。



简报


评论:


Stas和他的团队做得非常出色! 我希望他们的决定将得到社区的认可,我们将在新版本的Postgres中看到此解决方案。

在Avito中在PostgreSQL上扩展应用程序:提示和技巧。 康斯坦丁·埃夫捷夫(Avito)


我做了一个关于在Avito中在PostgreSQL上扩展应用程序的演示,并分享了我们的提示和技巧。



简报


评论:


一个有趣的方法:Kostantin非常有趣和清楚地解释了在微服务体系结构中处理数据时可能遇到的问题,并提出了扩展IP的解决方案。 佐贺被记住:)

逻辑复制和PostgreSQL事务隔离级别。 米哈伊尔·秋林


Michael编写了有关逻辑复制和PostgreSQL事务隔离级别的报告。



简报


评论:


迈克尔强调了交易的微妙时刻,不仅对于初学者而言,这是无法立即看到的。 每个人都需要知道这一点。

OZO是用于C ++ 17的异步类型安全的仅标头的PostgreSQL客户端库。 谢尔盖·汉德里科夫(Sergey Handrikov),Yandex


Sergey向听众介绍了如何安排OZO(用于C ++ 17的异步类型安全的仅标头的PostgreSQL客户端库),并邀请其做出贡献。



简报


评论:


在我看来,作者设法在短时间内迅速揭示了现有库中的问题以及新C ++库中的解决方案。 因此,如果这些库是在开源中开发的,那么更基本的东西已经实现,这将使我感到高兴。

测验问题答案


会议之前,我们邀请您回答有关Postgres的问题。 今天,我想显示正确的答案。 它们位于扰流板下方(以防万一)。


有一个没有用户记录的空表(“ UserId”为int,“ balance”为int)。 查询结果将返回什么?


with ins as ( insert into users select gs, gs * 10 from generate_series(1, 4) gs where gs%2 = 0) select * from users; 

答案

没事


select * from users where UserId = 10; 将会返回请求 select * from users where UserId = 10; 完成上一份工作后访问用户表时的方法?


答案

错误:“用户ID”列不存在。


由Enum CREATE TYPE状态定义为AS ENUM(“等待”,“初始化”,“运行”,“停止”); 哪个命令可以删除“ init”的值?


答案

没有从枚举中删除值的标准方法。


如何获得PostgreSQL中的功能列表?


答案

选择*从pg_proc;


查询结果将返回什么?


 select null = null, null is null, 1::smallint::boolean is true, null::bigint > 1 

答案

错误:无法将类型smallint强制转换为布尔值。


指示初级开发人员Vasya编写查询,该查询显示parent表中的所有条目,而parent表中没有条目。


数据架构:


 create table parent (parent_id serial primary key, payload text); create table child (child_id serial primary key, parent_id integer unique references parent (parent_id)); 

Vasya非常努力,不想面对尘土,因此他提出了八种不同的方法来解决问题:


 -- 0 select p.parent_id, p.payload from parent p where not exists(select from child c where c.parent_id = p.parent_id); -- 1 select p.parent_id, p.payload from parent p where not (array[p.parent_id] && array(select c.parent_id from child c)); -- 2 select distinct p.parent_id, p.payload from parent p full join child c on (c.parent_id = p.parent_id) where c.parent_id is null; -- 3 select p.parent_id, p.payload from parent p where p.parent_id not in (select c.parent_id from child c); -- 4 select p.parent_id, p.payload from parent p left join child c on (c.parent_id = p.parent_id) where c.parent_id is null; -- 5 with w_child_with_parents as ( select c.parent_id, ( select count(*) from parent p where c.parent_id = p.parent_id) = 1 as parent_exists from child c) select p.parent_id, p.payload from parent p where p.parent_id in (select pc.parent_id from w_child_with_parents pc where not pc.parent_exists); -- 6 select p.parent_id, p.payload from parent p full join child c on (c.parent_id = p.parent_id) group by p.parent_id, p.payload having count(c) = 0; -- 7 select p.parent_id, p.payload from parent p where p.parent_id in ( select p2.parent_id from parent p2 except all select c2.parent_id from child c2); 

Vasya向您介绍了他的选择,以便您可以帮助他选择最佳选择。 他声称所有查询都以相同的方式工作:将表放置在内存中,并且性能差异不明显(甚至不可见)。 但是,作为经验丰富的开发人员,您已经注意到,也许并非所有请求都可以解决任务。 列出无法解决任务的查询(并说明原因)。


简短答案

任务2、3和5无法解决此问题(在某些情况下,还会请求1)。


实验结果的答案

测试数据:


当子表中有parent_id为null的记录时,就会表现出该行为的“不正确性”。


 insert into parent (parent_id, payload) values (1, 'payload 1'), (2, 'payload 2'), (3, 'payload 3'), (4, 'payload 4'), (5, 'payload 5'); insert into child (child_id, parent_id) values (1, 1), (2, 3), (3, null), (5, 5); 

对给定的测试数据


  • 查询1,取决于是否安装了intarray扩展,是否可以工作。
  • 查询2返回一个额外的字符串(null,null)。
  • 查询3和5返回空结果集。

实验结果解释


请求1:如果数据库中安装了intarray扩展名( https://www.postgresql.org/docs/current/static/intarray.html ),则请求将崩溃,并显示错误“错误:数组不能包含空值”。 此行为是由于以下事实而引起的:扩展覆盖了标准运算符,并更改了包含空元素的数组的行为。


该文档说:


运算符&&,@>和<@等效于PostgreSQL的同名内置运算符,不同之处在于它们仅适用于不包含null的整数数组,而内置运算符适用于任何数组类型。 在许多情况下,此限制使它们比内置运算符更快。

请求2:由于完全连接,结果出现一个额外的字符串(null,null)。


请求3:由于子查询形成的集合具有空元素,因此返回空结果集。


文档( https://www.postgresql.org/docs/current/static/functions-subquery.html#FUNCTIONS-SUBQUERY-NOTIN ):


请注意,如果左侧表达式的结果为null,或者右侧不相等,并且至少一个右侧行的结果为null,则NOT IN构造的结果将为null,而不是true。 这符合SQL的空值布尔组合的常规规则。

查询5:返回空结果集,因为调用了w_child_with_parents节,子表和parent_id表为空或在该节中根本没有反映。


该测验的所有问题均由三位参与者正确回答。 我们在会议上将一个赠予了奖品,另外还有两套纪念品通过邮件寄出。



后记


一百多人参加了会议。 很高兴见到这样的听众。 根据一项调查,超过60%的mitap来宾具有五年以上使用数据库的经验。 当报告得到听众如此活跃的反馈时,这是非常好的:



在会议的间隙,有很多关于PostgreSQL成为越来越普遍的工具的讨论。 真的是 我借此机会说,我们在Avito中计划扩展DBA团队,如果您对大型项目中的雄心勃勃的任务感兴趣,请查看My Circle上的空缺或给我写信。



最后,我要感谢Yandex,Postgres Professional的同事,当然还要感谢Avito,我们听到了精彩的报道。 感谢在这个星期六那天来我们这里的客人以及现场观众。 当然,#RuPostgres社区值得信赖。


此处包含所有报告的播放列表。
我们在FacebookVKontakte 发布了照片报告



待会见!

Source: https://habr.com/ru/post/zh-CN424249/


All Articles