将纯文件插入/复制到 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 脚本吗?
有没有办法使用 sql 函数或现有的 psql 函数将非常大的表复制到多个 csv 文件中并指定输出文件中允许的最大行数?
例如,一个 3500 万行的表将输出 35 个 100 万行的 csv 文件。
我正在尝试在大型数据库上运行查询而不终止与服务器的连接。
我在具有 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_buffers和temp_buffers。没有一个起作用,性能大致相同。 …
我有诸如role1、role2、role3等列。它们都是布尔值。
我想在此表上创建一个视图,该视图具有类型为 的角色列text[]。如果有列TRUE, FALSE, TRUE,则视图将包含["role1", "role3"].
有什么好的方法可以做到这一点,并且不会爆炸成大量的CASE WHEN\xc2\xb4s 吗?澄清一下,我可以使用 O(n) CASE WHEN,但不能使用 O(2^n) ,这是目前似乎需要的。:)
我使用以下命令在 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。
我正在尝试删除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 …
考虑以下查询:
\n\nSELECT\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;\nRun Code Online (Sandbox Code Playgroud)\n\n它返回类似以下内容:
\n\ncountry count\nfr 3456\nus 569\nsc 248\n\xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n\n如何添加第三列以及占总计数的百分比?
\n软件:
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 性能,特别是插入。我正在运行速度测试脚本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):

但是,我得到的是以下内容:
所以每秒写入 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) 我遇到一个问题,似乎我的数据库中的一些大型表没有被 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 ×10
csv ×2
import ×2
array ×1
autovacuum ×1
backup ×1
connections ×1
copy ×1
count ×1
cte ×1
date-format ×1
group-by ×1
jit ×1
kill ×1
mac-os-x ×1
performance ×1
pg-dump ×1
pg-restore ×1
psql ×1
unpivot ×1