标签: postgresql

将普通(原始)文件导入 postgres 表(bytea 和大对象)

将纯文件插入/复制到 postgres 表中的好方法是什么(最好使用psql命令行)?

就我而言,这些文件是来自 Maildir 档案的一堆电子邮件,所以我尝试使用COPY

psql -c "COPY emails (data) FROM '/tmp/emailfile' WITH (FORMAT text);" emails
Run Code Online (Sandbox Code Playgroud)

我将在 for 循环 shell 脚本中使用它 ( for file in $(ls dir); do psql ...; done)。

但是,我无法找到文件中不可能存在的良好“分隔符”,并且我收到以下错误:ERROR: extra data after last expected column

因此,我考虑使用数据库中的COPY ... FORMAT binary版本和字段(然后将列转换到数据库内部),但这需要文件头和预告片,我没有简单的方法来即时构建。BYTEATEXT

有没有一种简单的方法可以从命令行执行此操作,或者我需要为此编写一个 python 脚本吗?

postgresql psql import copy

2
推荐指数
1
解决办法
6046
查看次数

将大型 PostgreSQL 表复制到行数有限的多个 csv 文件

有没有办法使用 sql 函数或现有的 psql 函数将非常大的表复制到多个 csv 文件中并指定输出文件中允许的最大行数?

例如,一个 3500 万行的表将输出 35 个 100 万行的 csv 文件。

postgresql csv

2
推荐指数
1
解决办法
4457
查看次数

对大型数据库的查询终止与服务器的连接,与 LIMIT 一起使用

我正在尝试在大型数据库上运行查询而不终止与服务器的连接。

我在具有 16GB 内存和大约 40GB 可用磁盘空间的 Mac 上使用 Postgres 12.1。根据数据,数据库为 78GB pg_database_size,最大表为 20GB pg_total_relation_size

无论我运行哪个非工作查询,我(从日志中)得到的错误是:

server process (PID xxx) was terminated by signal 9: Killed: 9
Run Code Online (Sandbox Code Playgroud)

在 VS 代码中,错误是"lost connection to server".

两个不起作用的例子是:

UPDATE table
SET column = NULL
WHERE column = 0;
Run Code Online (Sandbox Code Playgroud)
select columnA
from table1
where columnA NOT IN (
select columnB
from table2
);
Run Code Online (Sandbox Code Playgroud)

我可以通过添加 1,000,000 个来运行某些查询(例如上面的查询)LIMIT

我怀疑由于临时文件而导致磁盘不足,但在日志(带有log_temp_files = 0)中,我看不到任何正在写入的临时文件。

我尝试增加和减少work_mem, maintenance_work_mem,shared_bufferstemp_buffers。没有一个起作用,性能大致相同。 …

postgresql mac-os-x kill connections jit

2
推荐指数
1
解决办法
6672
查看次数

从布尔列构建数组

我有诸如role1role2role3等列。它们都是布尔值。

\n\n

我想在此表上创建一个视图,该视图具有类型为 的角色列text[]。如果有列TRUE, FALSE, TRUE,则视图将包含["role1", "role3"].

\n\n

有什么好的方法可以做到这一点,并且不会爆炸成大量的CASE WHEN\xc2\xb4s 吗?澄清一下,我可以使用 O(n) CASE WHEN,但不能使用 O(2^n) ,这是目前似乎需要的。:)

\n

postgresql array unpivot

2
推荐指数
1
解决办法
1135
查看次数

pg_restore 后数据库大小不同(389 GB 与 229 GB)

我使用以下命令在 PostgreSQL 11.6(带有 TimescaleDB 1.60 扩展)中创建了数据库的备份pg_dump

PGPASSWORD=mypassword pg_dump -h 127.22.0.4 -p 5432 -U postgres -Z0 -Fc database_development
Run Code Online (Sandbox Code Playgroud)

并将其恢复到运行相同版本的 PostgreSQL 11.6(带有 TimescaleDB 1.60 扩展)的新服务器pg_restore。对于恢复,以psql用户身份执行以下命令postgres

CREATE DATABASE database_development;
\c database_development
CREATE EXTENSION timescaledb;
SELECT timescaledb_pre_restore();

\! time pg_restore -Fc -d database_development /var/lib/postgresql/backups/database_development_2020-02-29

SELECT timescaledb_post_restore();
Run Code Online (Sandbox Code Playgroud)

原始数据库的数据库大小为 389 GB,但恢复的数据库为 229 GB。这些尺寸是通过运行获得的

select pg_size_pretty(pg_database_size('database_development'))
Run Code Online (Sandbox Code Playgroud)

一些差异:

旧数据库存储在 ext4 分区上,而新数据库存储在禁用压缩的 ZFS 文件系统上。两个数据库实例都在具有 Ubuntu 18.04 主机的 Docker 容器内运行。

问题:我们如何解释数据库大小的差异?pg_dump和期间都没有遇到错误pg_restore

postgresql backup pg-dump pg-restore postgresql-11

2
推荐指数
1
解决办法
2217
查看次数

PostgreSQL 10:删除外键锁选择

我正在尝试删除incoming每秒有 100 个事务的繁忙数据库中的一个表(称为 )。表本身是空的(truncate table之前执行过)。如果我尝试在其他各种正在等待的表上执行drop table incoming大量事务drop table显然不好。

我开始一一删除索引、约束和列,以确定是什么阻止了表删除,并找到了导致锁定的外键约束。这是“最终”incoming表架构:

create table incoming
(
    account_id integer
        constraint incoming_account_id_fkey
            references account
);
Run Code Online (Sandbox Code Playgroud)

从被阻止的查询来看(ticket以下表为例),看起来并不是account表查询被阻止,而是在一个繁忙的表上的查询ticket,该表具有该表的外键account。为什么删除 FK inincoming块查询ticket

这是 3 个表的概要:

  • incoming- 这是我要删除的外键所在的位置(参见下面的架构)。
  • account- 外键参考表。
  • ticket- 具有外键约束的繁忙表(选择、插入、更新等)account

我尝试做的事情:

我尝试禁用 table: 上的触发器ALTER TABLE incoming DISABLE TRIGGER ALL;并设置 FK DEFERRABLE: ALTER TABLE incoming ALTER CONSTRAINT incoming_account_id_fkey …

postgresql

2
推荐指数
1
解决办法
2502
查看次数

使用 GROUP BY 计算列的百分比

考虑以下查询:

\n\n
SELECT\n  country\n  , count(id) AS "count"\nFROM\n  lead\nWHERE\n  date_part(\'year\', lead.since) = date_part(\'year\', CURRENT_DATE)\nGROUP BY "country"\nORDER BY "count" DESC\n;\n
Run Code Online (Sandbox Code Playgroud)\n\n

它返回类似以下内容:

\n\n
country count\nfr  3456\nus  569\nsc  248\n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何添加第三列以及占总计数的百分比?

\n

postgresql cte count window-functions group-by

2
推荐指数
1
解决办法
1491
查看次数

PostgreSQL:日期/时间字段值超出范围

软件:

Linux cjz-eshop1-p 5.4.0-33-generic #37-Ubuntu SMP Thu May 21 12:53:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
psql (PostgreSQL) 12.3 (Ubuntu 12.3-1.pgdg18.04+1)
Run Code Online (Sandbox Code Playgroud)

由于将 CSV 导入我的服务器上的数据库,我收到错误。

ERROR: current transaction is aborted, commands ignored until end of transaction block
Price 244385 ERROR: date/time field value out of range: "30.06.2020"
  Hint: Perhaps you need a different "datestyle" setting.
  Position: 160
ERROR: current transaction is aborted, commands ignored until end of transaction block
Price 244386 ERROR: date/time field value out of range: "30.06.2020"
  Hint: Perhaps …
Run Code Online (Sandbox Code Playgroud)

postgresql import date-format csv

2
推荐指数
1
解决办法
5万
查看次数

我期望 postgresql 有多快?

我正在评估时间序列应用程序的 postgresql 性能,特别是插入。正在运行速度测试脚本sqlalchemyhttps://docs.sqlalchemy.org/en/13/faq/performance.html#im-inserting-400-000-rows-with-the-orm-and-it-真的很慢。你可以忽略 ORM 的东西,它是显示性能的倒数第二个“核心”行。

我预计每秒会看到 10 到 100k 写入,例如(https://docs.timescale.com/latest/introduction/timescaledb-vs-postgres): PostgreSQL 和 Timescale 比较

但是,我得到的是以下内容:

性能测试结果

所以每秒写入 358 次!相比之下,sqlite 每秒写入 83k。

这对我来说似乎真的很慢,但我在 Windows 安装、Windows 上的 Docker、本机 Ubuntu 和 Ubuntu 上的 Docker 中始终获得这种性能。

我的期望与现实不符,还是我做错了什么?

编辑:

澄清一下,我还没有使用 Timescale DB 的 hyptertables 功能,只是普通的 PostgreSQL 表。我正在使用 TimescaleDB docker 安装进行 docker 测试(尽管不是本机测试)。具体来说,我正在调用

docker run -d --rm -p 5433:5432 -e POSTGRES_PASSWORD=password timescale/timescaledb:latest-pg12
Run Code Online (Sandbox Code Playgroud)

postgresql performance

2
推荐指数
1
解决办法
8419
查看次数

PostgreSQL 某些表的last_vacuum为空

我遇到一个问题,似乎我的数据库中的一些大型表没有被 autovacuum 守护进程清理。这是我所看到的:

SELECT schemaname, relname, n_live_tup, n_dead_tup, last_autovacuum
FROM pg_stat_all_tables
ORDER BY n_dead_tup DESC LIMIT 5;
+------------+-----------------------------+------------+------------+-------------------------------+
| schemaname |          relname            | n_live_tup | n_dead_tup |        last_autovacuum        |
+------------+-----------------------------+------------+------------+-------------------------------+
| md         | calculation_log_item        |   35989527 |    3559253 | 2020-07-13 03:41:37.49764-04  |
| audit      | transaction_statement       |     700356 |     557278 | NULL                          |
| audit      | record_history              |     701635 |     438849 | NULL                          |
| md         | program_requirement_state   |     193500 |      29204 | 2020-07-14 03:06:02.339032-04 |
| md         | calculation_log …
Run Code Online (Sandbox Code Playgroud)

postgresql autovacuum

2
推荐指数
1
解决办法
1881
查看次数