标签: postgresql

解决 PostgreSQL INSERT 性能不佳问题的系统配置

问题症状

postmaster与尝试插入低容量行的客户端连接相关的子进程的 CPU 使用率较高(导致插入的行比使用相同行慢 25 倍)。COPY ... FROM STDIN

背景

尝试识别系统/数据库配置以缓解上述较差的插入性能。我正在使用多线程 R 脚本来处理数据并将结果插入到 PostgreSQL 数据库中。我对 R 脚本进行了分析,以隔离调用的性能瓶颈DBI::dbBind(),同时用于top监视postmaster与子 R 线程打开的连接关联的子进程(请参阅下面的代码)。在 INSERT 期间,R 子进程大部分时间处于空闲状态(大概是在等待调用返回DBI::dbBind()),而postmaster子进程在其运行大约 2-3 分钟的时间内消耗了 95-100% 的 CPU。

系统/环境:

  • postgresql 版本 10.3(Fedora 包 10.3-5.fc27)
  • uname -a:Linux localhost 4.16.6-202.fc27.x86-64 #1 SMP Wed May 2 00:09:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
  • /proc/cpuinfo: 16 个处理器 ( Intel(R) Xeon(R) CPU D-1541 @ 2.10GHz)
  • ulimit …

postgresql performance configuration r postgresql-10 postgresql-performance

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

如何针对高频更新优化表?

我有一个表,其中包含需要定期运行的任务列表:

applaudience=> \d+ maintenance_task
                                                                       Table "public.maintenance_task"
               Column               |           Type           | Collation | Nullable |                   Default                    | Storage  | Stats target | Description
------------------------------------+--------------------------+-----------+----------+----------------------------------------------+----------+--------------+-------------
 id                                 | integer                  |           | not null | nextval('maintenance_task_id_seq'::regclass) | plain    |              |
 nid                                | citext                   |           | not null |                                              | extended |              |
 execution_interval                 | interval                 |           | not null |                                              | plain    |              |
 last_attempted_at                  | timestamp with time zone |           |          | now()                                        | plain    |              |
 last_maintenance_task_execution_id | integer                  |           |          | …
Run Code Online (Sandbox Code Playgroud)

postgresql vacuum update

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

查询获取加权百分位数

尝试生成 SQL 来计算给定百分位值集的加权连续值(下面使用的 25%、50% 和 75% 级别,但解决方案应允许任意参数级别)。换句话说,想要找到下面“源”表中测试数据的 25%、50% 和 75% 累积百分位数的插值“原始”值(按“cnt”加权)。

注意: 表示采样期间cnt该值出现的次数,预期输出将对该值进行加权以得出百分位数(类似于分位数/中位数和类似的统计数据)rawrawcnt

测试数据:(表:来源)

|  site  |  dateval   |  raw  |   cnt   |
+--------+------------+-------+---------+
|   A    | 2019-01-05 |   45  |      14 |
|   A    | 2019-01-05 |   52  |     178 |
|   A    | 2019-01-05 |   45  |       9 |
|   A    | 2019-01-05 |   37  |      75 |
|   A    | 2019-01-05 |   23  |      98 |
|   A    | 2019-01-05 | …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate postgresql-10

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

我可以将 CITEXT 列更改为 VARCHAR 而不会遇到任何意外困难吗?

我在应用程序中的一个特别大的表上过度使用了 CITEXT 列。我想支持其中一些,因为如何触发所需索引的查找令人困惑。

我的问题是,我可以在不遇到任何重大困难的情况下做到这一点吗?如果我更改此设置,我是否需要重建这些字段上的任何索引?

朝这个方向发展会带来空间收益吗?

这些列不需要不区分大小写的查询。

我对该表进行了基于 2 列的计数,这些计数需要一个多小时。该表有 60 列。

我正在使用 Postgres 10.6。

我主要感兴趣的是,如果索引包含已从 CITEXT 更改为 VARCHAR 的列,是否需要重建索引。

postgresql postgresql-10 citext

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

如何使 PostgreSQL 中的“phraseto_tsquery”与“plainto_tsquery”一样快

一些背景:

\n\n

我有一个表,documents其中包含超过 200,000 行,其中有一列body,该列可能很长。我在这张表上放置了一个索引:

\n\n
CREATE INDEX documents_body_tsvector_index ON documents USING GIN (to_tsvector('english', body));\n
Run Code Online (Sandbox Code Playgroud)\n\n

有了这个索引,我的包含 WHERE 子句的查询速度to_tsvector('english', body) @@ to_tsquery('english', 'awesome')非常快,这很棒。

\n\n

问题:

\n\n

虽然plainto_tsquery('english', 'awesome website')运行速度很快,但phraseto_tsquery('english', 'awesome website') runs extremely slow. (I've also triedto_tsquery('english', 'awesome <-> website') 也运行得很快,而且速度也非常慢。)

\n\n

问题:

\n\n

我怎样才能加快速度?我的索引做错了吗?我真的需要考虑到\xe2\x80\x94的位置,phraseto_tsquery使用似乎是最好的方法。任何帮助将非常感激。

\n\n

(编辑)解释:

\n\n

这是快速查询:

\n\n
EXPLAIN (ANALYZE, BUFFERS) SELECT COUNT(*)\nFROM documents\nWHERE to_tsvector('english', body) @@ plainto_tsquery('english', 'termone termtwo');\n\nAggregate  (cost=57.16..57.17 rows=1 width=8) (actual time=4.386..4.387 rows=1 …
Run Code Online (Sandbox Code Playgroud)

postgresql index

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

Postgres 会处理 Unix Epoch 问题吗?

我想知道 Postgres 是否会处理 2038 年出现的 unix 纪元问题?我读过这篇文章并且很想知道。

这显然与生产力有关,因为它距离太远,但我很好奇。

postgresql dbms

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

Postgres中Drop表和Truncate表的速度差异

我目前有一个程序,通过创建临时表、填充表,然后将该数据合并到主表中来插入数据库。然后放下桌子并重新做一遍。我想知道如果我只是截断而不是删除和创建,速度差异是多少。

postgresql benchmark truncate drop-table

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

“不要使用错误进行流量控制”公理适用于 postgres 吗?

在传统编程中,有一条公理:“不要使用错误进行流程控制”。一个常见的示例是抛出错误然后捕获错误,而不是使用普通的条件语句或break语句。这是有害的,因为应用程序必须展开调用堆栈并调用一些相对昂贵的异常处理逻辑,而不是简单地处理条件语句。

我正在使用 Postgres 系统,其中用户在 Postgres 中调用一个函数,该函数在不满足条件时抛出错误而不是不返回任何行。该条件大致是“此输入值不存在,无事可做”,而不是真正的例外情况。

当以与传统编程类似的方式抛出错误时,Postgres 是否会产生运行时成本?换句话说,在 Postgres 中使用异常作为流量控制对性能有害还是只是草率?

postgresql condition error-handling plpgsql

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

Postgres 堆与 SQL Server 聚集索引

我正在从 SQL Server 过渡到 Postgres,对我来说最需要消化的事情之一是不存在用于对 Postgres 中的数据进行排序的“聚集键”。

有人可以分享一下他们对 Postgres 如何避免内部排序数据集的需要以及它如何与大型堆表一起工作并仍然提供卓越性能的想法吗?

postgresql sql-server clustered-index database-internals heap

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

gin_trgm_ops 索引创建失败

我正在尝试在包含名称的文本字段上创建三元组索引。我已将 pg_trgm 扩展添加到架构中。运行\dx显示已启用:

List of installed extensions
   Name    | Version |   Schema   |                            Description                            
-----------+---------+------------+-------------------------------------------------------------------
 btree_gin | 1.3     | pg_catalog | support for indexing common datatypes in GIN
 dblink    | 1.2     | wos_core   | connect to other PostgreSQL databases from within a database
 pg_trgm   | 1.4     | wos_core   | text similarity measurement and index searching based on trigrams
 plpgsql   | 1.0     | pg_catalog | PL/pgSQL procedural language
(4 rows)
Run Code Online (Sandbox Code Playgroud)

但是,当我运行以下命令时:

CREATE INDEX authors_full_name_idx ON wos_core.interface_table USING GIN (authors_full_name …
Run Code Online (Sandbox Code Playgroud)

postgresql index

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