广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >如何使用PostgreSQL的数组类型
  • 511
分享到

如何使用PostgreSQL的数组类型

2024-04-02 19:04:59 511人浏览 八月长安
摘要

这篇文章主要介绍“如何使用postgresql的数组类型”,在日常操作中,相信很多人在如何使用Postgresql的数组类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何

这篇文章主要介绍“如何使用postgresql数组类型”,在日常操作中,相信很多人在如何使用Postgresql的数组类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用PostgreSQL的数组类型”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

在Heap中,我们依靠PostgreSQL支撑大多数后端繁重的任务,我们存储每个事件为一个hstore blob,我们为每个跟踪的用户维护一个已完成事件的PostgreSQL数组,并将这些事件按时间排序。 Hstore能够让我们以灵活的方式附加属性到事件中,而且事件数组赋予了我们强大的性能,特别是对于漏斗查询,在这些查询中我们计算不同转化渠道步骤间的输出。

在这篇文章中,我们看看那些意外接受大量输入的PostgreSQL函数,然后以高效,惯用的方式重写它。

你的***反应可能是将PostgreSQL中的数组看做像C语言中对等的类似物。你之前可能用过变换阵列位置或切片来操纵数据。不过要小心,在PostgreSQL中不要有这样的想法,特别是数组类型是变长的时,比如JSON、文本或是hstore。如果你通过位置来访问PostgreSQL数组,你会进入一个意想不到的性能暴跌的境地。

这种情况几星期前在Heap出现了。我们在Heap为每个跟踪用户维护一个事件数组,在这个数组中我们用一个hstore datum代表每个事件。我们 有一个导入管道来追加新事件到对应的数组。为了使这一导入管道是幂等的,我们给每个事件设定一个event_id,我们通过一个功能函数重复运行我们的事 件数组。如果我们要更新附加到事件的属性的话,我们只需使用相同的event_id转储一个新的事件到管道中。 

所以,我们需要一个功能函数来处理hstores数组,并且,如果两个事件具有相同的event_id时应该使用数组中最近出现的那个。刚开始尝试这个函数是这样写的:

-- This is slow, and you don't want to use it! -- -- Filter an array of events such that there is only one event with each event_id. -- When more than one event with the same event_id is present, take the latest one. CREATE OR REPLACE FUNCTioN dedupe_events_1(events HSTORE[]) RETURNS HSTORE[] AS $$   SELECT array_agg(event)   FROM (     -- Filter for rank = 1, i.e. select the latest event for any collisions on event_id.     SELECT event     FROM (       -- Rank elements with the same event_id by position in the array, descending.       SELECT events[sub] AS event, sub, rank()       OVER (PARTITION BY (events[sub] -> 'event_id')::BIGINT ORDER BY sub DESC)       FROM generate_subscripts(events, 1) AS sub     ) deduped_events     WHERE rank = 1     ORDER BY sub ASC   ) to_agg; $$ LANGUAGE SQL IMMUTABLE;

这样奏效,但大输入是性能下降了。这是二次的,在输入数组有100K各元素时它需要大约40秒!

如何使用PostgreSQL的数组类型

这个查询在拥有2.4GHz的i7CPU及16GB Ram的Macbook pro上测得,运行脚本为:https://GISt.GitHub.com/drob/9180760。

在这边究竟发生了什么呢? 关键在于PostgreSQL存贮了一个系列的hstores作为数组的值, 而不是指向值的指针. 一个包含了三个hstores的数组看起来像
{“event_id=>1,data=>foo”, “event_id=>2,data=>bar”, “event_id=>3,data=>baz”}
相反的是
{[pointer], [pointer], [pointer]}

对于那些长度不一的变量, 举个例子. hstores, json blobs, varchars,或者是 text fields, PostgreSQL 必须去找到每一个变量的长度.  对于evaluateevents[2], PostgreSQL 解析从左侧读取的事件直到读取到第二次读取的数据. 然后就是  forevents[3], 她再一次的从***个索引处开始扫描,直到读到第三次的数据! 所以, evaluatingevents[sub]是  O(sub), 并且 evaluatingevents[sub]对于在数组中的每一个索引都是 O(N2), N是数组的长度.

PostgreSQL能得到更加恰当的解析结果,  它可以在这样的情况下分析该数组一次. 真正的答案是可变长度的元素与指针来实现,以数组的值, 以至于,我们总能够处理 evaluateevents[i]在不变的时间内.

即便如此,我们也不应该让PostgreSQL来处理,因为这不是一个地道的查询。除了generate_subscripts我们可以用unnest,它解析数组并返回一组条目。这样一来,我们就不需要在数组中显式加入索引了。

-- Filter an array of events such that there is only one event with each event_id. -- When more than one event with the same event_id, is present, take the latest one. CREATE OR REPLACE FUNCTION dedupe_events_2(events HSTORE[]) RETURNS HSTORE[] AS $$   SELECT array_agg(event)   FROM (     -- Filter for rank = 1, i.e. select the latest event for any collisions on event_id.     SELECT event     FROM (       -- Rank elements with the same event_id by position in the array, descending.       SELECT event, row_number AS index, rank()       OVER (PARTITION BY (event -> 'event_id')::BIGINT ORDER BY row_number DESC)       FROM (         -- Use unnest instead of generate_subscripts to turn an array into a set.         SELECT event, row_number()         OVER (ORDER BY event -> 'time')         FROM unnest(events) AS event       ) unnested_data     ) deduped_events     WHERE rank = 1     ORDER BY index ASC   ) to_agg; $$ LANGUAGE SQL IMMUTABLE;

结果是有效的,它花费的时间跟输入数组的大小呈线性关系。对于100K个元素的输入它需要大约半秒,而之前的实现需要40秒。

这实现了我们的需求:

  • 一次解析数组,不需要unnest。

  • 按event_id划分。

  • 对每个event_id采用***出现的。

  • 按输入索引排序。

教训:如果你需要访问PostgreSQL数组的特定位置,考虑使用unnest代替。

到此,关于“如何使用PostgreSQL的数组类型”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何使用PostgreSQL的数组类型

本文链接: https://www.lsjlt.com/news/75576.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用PostgreSQL的数组类型
    这篇文章主要介绍“如何使用PostgreSQL的数组类型”,在日常操作中,相信很多人在如何使用PostgreSQL的数组类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何...
    99+
    2022-10-19
  • java mybatis如何操作postgresql array数组类型
    目录我定义了几个基础数据类型的数组java mybatis操作 postgresql array数组类型备忘找了半天没有找到postgresql中关于array数组类型的字段如何对应...
    99+
    2022-11-13
  • PostgreSQL中如何使用jsonb数据类型
    PostgreSQL中如何使用jsonb数据类型,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。PostgreSQL 9.4 正在加载一项新...
    99+
    2022-10-18
  • PostgreSQL 数组类型操作使用及特点详解
    目录PostgreSQL 数组类型使用详解下面列出一些PostgreSQL的特点数组类型的基本操作1 查询2 插入数据3 条件查询4 更新4.1 更新标签的名称4.2 添加一个标签5...
    99+
    2022-11-13
    PostgreSQL 数组类型操作 PostgreSQL 数组类型
  • PostgreSQL中如何使用Lateral类型
    这篇文章给大家介绍PostgreSQL中如何使用Lateral类型,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。PostgreSQL 9.3 用了一种新的联合类型! Lateral联合...
    99+
    2022-10-18
  • PostgreSQL中如何使用日期类型
    PostgreSQL中如何使用日期类型,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。当前时间/日期/时间戳获取当前时间的方式有...
    99+
    2022-10-18
  • PostgreSQL中json数据类型怎么使用
    这篇文章主要介绍“PostgreSQL中json数据类型怎么使用”,在日常操作中,相信很多人在PostgreSQL中json数据类型怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PostgreSQL中...
    99+
    2023-07-05
  • PostgreSQL中如何使用数组
    PostgreSQL中如何使用数组,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。这种情况几星期前在Heap出现了。我们在Heap为每个跟踪...
    99+
    2022-10-18
  • 常用的PostgreSQL数据类型有哪些
    PostgreSQL包含以下常用的数据类型: 数值类型:整数(integer)、小数(decimal)、浮点数(float)、双...
    99+
    2023-10-23
    PostgreSQL
  • 如何在Laravel中使用Python的数据类型数组?
    Laravel是一个流行的PHP框架,它提供了许多功能强大的工具和库,使得开发Web应用程序变得更加容易。Python作为一种流行的编程语言,也拥有强大的数据类型和库。在本文中,我们将讨论如何在Laravel中使用Python的数据类型数组...
    99+
    2023-10-20
    数据类型 数组 laravel
  • 如何使用Python中的数组数据类型构建Laravel应用?
    随着Web应用程序的快速发展,越来越多的开发者选择使用Laravel作为他们的开发框架。而Python作为一种强大的编程语言,也被广泛应用于Web开发,特别是在数据处理和分析方面。本文将介绍如何使用Python中的数组数据类型构建Larav...
    99+
    2023-10-19
    数据类型 数组 laravel
  • Postgresql数据库中的json类型字段使用示例详解
    目录1. json概述2. PostgreSQL数据库中使用Json类型字段2.1. 创建表定义字段信息2.2. 增加2.3. 查询键值2.3.1. 查询键2.3.2. 查询值2.3.3. where查询条件使...
    99+
    2023-02-09
    Postgresqljson类型字段使用 Postgresqljson字段
  • Java中如何使用Apache库处理数组数据类型?
    Apache是一个非常流行的开源软件基金会,提供了许多优秀的库和工具来处理各种数据类型。在Java中,我们可以使用Apache库来处理数组数据类型。在本文中,我们将介绍如何使用Apache库来处理数组数据类型,并提供一些示例代码。 一、A...
    99+
    2023-11-03
    数据类型 数组 apache
  • 如何在 ASP 中使用分布式数组数据类型?
    ASP(Active Server Pages)是一种基于服务器端的脚本语言,用于开发动态网站和Web应用程序。在ASP中,分布式数组数据类型是一种非常重要的数据类型,它允许我们在多个服务器上存储数据,并在需要时访问这些数据。 下面是如何在...
    99+
    2023-07-29
    数据类型 数组 分布式
  • 如何解析C++的C++数组类型
    如何解析C++的C++数组类型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C++数组的类型实际上是指数组元素的取值类型,对于同一个数组,其所有元素的数据类型都是相同的,数组名...
    99+
    2023-06-17
  • 在golang xorm中使用postgresql的json,array类型的操作
    xorm支持各种关系数据库,最近使用postgresql时,总是踩到一些坑,在此记录下解决方式。 在使用postgresql的array类型时,查询有点问题,xorm的官方文档给出重...
    99+
    2022-11-12
  • Apache服务器中如何使用PHP数组和数据类型?
    PHP是一种在Web开发中广泛使用的编程语言,它拥有许多有用的功能,其中包括数组和数据类型。在Apache服务器中使用PHP数组和数据类型可以让你更轻松地处理数据和管理服务器。 本文将介绍如何在Apache服务器中使用PHP数组和数据类型...
    99+
    2023-09-15
    apache 数组 数据类型
  • thinkphp5 使用模型查询对象类型转数组
    在ThinkPHP5中,可以使用模型的toArray方法将查询结果对象类型转换为数组类型。以下是一个例子:1. 假设有一个User模...
    99+
    2023-10-11
    php
  • 如何使用npm和ASP处理复杂的数据类型和数组?
    随着Web应用程序变得越来越复杂,处理数据的需求也越来越高。在这种情况下,使用npm和ASP来处理复杂的数据类型和数组是非常必要的。本文将为您介绍如何使用npm和ASP处理复杂的数据类型和数组。 一、什么是npm? npm是一个包管理器,它...
    99+
    2023-08-15
    npm 数组 数据类型
  • 如何使用Go语言的数据类型来实现数组同步?
    Go语言是一门由Google开发的编程语言,它具有简单、快速、安全等特点。在Go语言中,数组是一种非常重要的数据类型,它可以用来存储一组相同数据类型的元素。但是,在多线程的情况下,如果多个线程同时对同一个数组进行操作,就可能会出现数据不一...
    99+
    2023-10-11
    数据类型 同步 数组
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作