AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 310598
Accepted
Charlie Clark
Charlie Clark
Asked: 2022-04-07 01:06:38 +0800 CST2022-04-07 01:06:38 +0800 CST 2022-04-07 01:06:38 +0800 CST

Postgres 对批量加载转换功能的改进

  • 772

我定期从 httparchive.org 导入数据。数据是一个 MySQL CSV 导出,我使用 pgloader,它处理这个导出的怪癖(\Nfor NULL)等。我还需要做一些额外的处理以进行规范化:

  • 在协议 (http|https) 和主机部分中拆分 url
  • 将字符串日期“Mon DD YYYY”转换为日期对象

目前,我在导入数据时有一些触发器可以执行此操作,但我正在寻找改进方法,特别是查看是否可以并行运行某些步骤。

我有以下用于提取协议和端口的 CTE:

with split as
(select regexp_match(url, '(https|http)://(.+)/' )as parts 
from urls )

在本地运行这似乎比tsdebug

这适用于选择,但作为更新似乎非常慢。

with split as
(select regexp_match(url, '(https|http)://(.+)/' )as parts 
from urls )
update urls
set 
protocol = parts[1],
host = parts[2] 
from split

另一种方法,尤其是在处理文本源时,会在 URL 进入 Postgres 之前对其进行拆分。

未压缩的 CSV 为 3526430884 字节,导入大约需要 20 分钟,无需处理。但这与加工相比是两倍多。FWIW 我也尝试过使用外部数据包装器。但是,即使在使用 CSV(空值、编码)解决了各种问题之后,这也会导致内存错误。

在一些帮助下,我设法运行了基准测试并改进了我的触发器。

CREATE OR REPLACE FUNCTION public.extract_protocol()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
DECLARE elements text [];
BEGIN
elements := regexp_match(NEW.url, '(https|http)://(.+)/');
NEW.protocol = elements[1];
NEW.host = elements[2];
RETURN NEW;
END;
$function$

现在,这比进行后续更新运行得更快,但两者都不是限制因素。现在的瓶颈是在将清理后的数据插入主表时索引的开销。我认为我唯一的选择是权衡插入索引的成本,而不是禁用然后添加它们。

postgresql csv
  • 1 1 个回答
  • 29 Views

1 个回答

  • Voted
  1. Best Answer
    a_horse_with_no_name
    2022-04-07T02:08:34+08:002022-04-07T02:08:34+08:00

    您的 UPDATE 语法会生成表urls与split结果的交叉连接。这本质上是表与自身的交叉连接。

    您需要在目标表和源表之间建立某种连接条件。显而易见的选择是表的主键列。

    with split as (
      select pk_column, regexp_match(url, '(https|http)://(.+)/' ) as parts 
      from urls 
    )
    update urls
      set protocol = s.parts[1],
          host = s.parts[2] 
    from split s 
    where urls.pk_column = s.pk_column --<< here
    

    我认为您尝试通过使用 CTE 来避免两次评估正则表达式会使事情变得更慢,而不是更快。我预计将表与自身连接的开销远大于两次评估正则表达式的开销。

    所以我认为,你也应该尝试:

    update urls
      set protocol = (regexp_match(url, '(https|http)://(.+)/' ))[1]
          host = (regexp_match(url, '(https|http)://(.+)/' ))[2]
    
    • 1

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve