Postgres 14中的更好的范围类型:将100行的SQL转换为3

2021-06-10 06:35:46

我可以谈谈PostgreSQL的好处,以整天应用程序开发和运营。但是有两种持久的主题,靠近我的心:船船(你需要更新你的密码来使用扰流)和范围类型。

我在PostgreSQL 9.2中发布以来,ve' ve and and vere and range类型。在我加入嘎吱嘎吱的数据之前,我在生产中部署了它们,以帮助管理成熟的调度和空间预订应用程序。性能明智,范围类型提供了一种快速方式来通过时间数据集执行复杂的查找!

随着范围类型的所有权力和灵活性,有一个不幸的限制:使用非重叠(或非不连续)范围。现在不要让我错了,它为我提供了编写一些非常高级递归的SQL并建立一些很酷的实时数据管理系统的机会。但是,这是以方便和可维护性的成本。

在第一次推出范围类型之后几年,PostgreSQL 14现在增加了写一些&#34的能力;无聊的SQL"进一步解锁使用范围数据的功率。遇见"多范围"数据类型。

它感觉像Déjàvu遍历再次:PostgreSQL 9.2引入了JSON和距离类型。 PostgreSQL 14添加了更好的JSON和多个类型。

Postgres 14现在增加了对多范围类型的支持。这些是支持将非连续范围分组的数据类型。这是一个如此的快速示例:

什么'很酷的那个,现在我可以在这些多个语言类型中查询,并确定它是否存在特定值,或者如果存在重叠范围:

选择current_date + 1< @ datemultirange(daterange(current_date,current_date + 2),daterange(current_date + 5,current_date + 8));

选择current_date + 3< @ datemultirmange(daterange(current_date,current_date + 2),daterange(current_date + 5,current_date + 8));

选择daterange(current_date + 1,current_date + 5)&& dateMultirange(Daterange(Current_date,Current_date + 2),Daterange(Current_date + 5,Current_date + 8));

选择daterange(current_date + 3,current_date + 4)&& dateMultirange(Daterange(Current_date,Current_date + 2),Daterange(Current_date + 5,Current_date + 8));

凉爽的。您可以通过将多个后缀添加到范围类型名称的末尾,例如,通过现有范围类型创建多范范围,例如:

然而,这仅划伤多范围类型的电力的表面。我认为最酷的部分是如何通过单个聚合:Range_AGG来大大地简化过度复杂的递归查询。

让' s构建与我们在以前的博客文章中所拥有的类似示例,以使用范围类型搜索可用性。我们' ll在约会中将示例更改为几天:

创建表约定(默认情况下生成的ID INT为身份主键,Adending_dates Daterange Not Null,使用GIST排除(与&&&&&))排除;

让' s创建一组类似与前面示例中所拥有的约会日期:

插入约会(约会)值(Daterange(' 2021-06-02' 2021-06-02' [39; []')),( Daterange(' 2021-06-06' 2021-06-09&#39 ;,' []')),(Daterange(' 2021- 06-11&#39 ;,' 2021-06-12&#39 ;,' []')),(Daterange(' 2021-06-16' #39; 2021-06-17&#39 ;,' []')),(Daterange(' 2021-06-25' 2021-06-27' 2021-06-27 #39 ;,' []'));

现在,让我们说我们希望返回我们在6月份预约的所有日期。我们可以使用单个查询来完成此操作:

如果我们想要将所有这些日期汇集到一个多个多个多个数据中,我们可以使用Range_AGG执行此操作:

回想一下,前面的例子想要解决的问题是"找到一个日期我可以在给定的月份在一个特定的月份&#34中提供约会。要解决此前,我们写了一个相当涉及的递归查询。具有多范围类型,我们可以简化此操作:

哇!那个' S的方式更简单。虽然先前的方法我所示的作品,但这更简单,易于错误,并且提供了许多优点,包括:

更容易理解:这只是3行直接SQL,VS.一个复递归查询。 更容易维护:如果较少的SQL较少维护,例如,如果您的架构有更新。 较少的存储:由于查询的成本,以前的方法需要您"预编译" 更大系统的可用性。 凭借范围聚合(Range_AGG)和多数据类型差( - )运算符的效率,如果不消除预先计算您的可用性的需要,则减少。 Postgres 14现在处于β。 我强烈建议下载它,踢掉轮胎,并看到您可以部署一些新功能的其他有趣方式。 如果您已经使用范围类型以非琐碎的方式使用范围类型,我建议您使用新的多范围类型进行游戏:您可以在不牺牲性能的情况下简化您的查询!