标签: postgresql

大批量 INSERTs/UPDATEs 和 DELETEs 性能问题

我在寻找解决以下问题的最佳选择时遇到了问题(postgres 9.5):

我一次从另一个系统获得大约 100.000 行的更新批次。这种情况通常每 10-15 分钟发生一次,但我可能会同时收到多个批次。批次由“类别”分隔,一个批次只包含来自一个批次的数据。每个“类别”每 10-15 分钟更新一次。新行被插入,旧行被删除,仍然存在的行应该更新为新值。

这带来了表产生大量垃圾数据、VACUUM 进程运行非常缓慢以及一般表性能非常差的问题。

现在我想我可以通过为数据中的每个“类别”创建子表并因此“分片”数据来解决这个问题。

在这种情况下,这是否有意义,还是有更好的选择让我坚持?

postgresql

6
推荐指数
1
解决办法
921
查看次数

何时需要 FROM 子句中的 COLUMN 别名?

FROM提供column_alias,SQL 规范调用这些<derived column list>子句。这就是 postgres 文档对它们的描述,

FROM包含别名的项目的替代名称。别名用于简洁或消除自联接(多次扫描同一个表)的歧义。当提供别名时,它完全隐藏了表或函数的实际名称;例如 given FROM foo AS f, 的其余部分SELECT必须将此FROM项目称为fnot foo。如果编写了别名,还可以编写列别名列表来为表的一列或多列提供替代名称。

什么时候需要这些?我什么时候不能只使用 COLUMN 别名?

SELECT t.*
FROM table_name AS t (a,b,c);
Run Code Online (Sandbox Code Playgroud)

对比

SELECT t.col1 AS a, t.col2 AS b, t.col3 AS c
FROM table_name AS t;
Run Code Online (Sandbox Code Playgroud)

这个例子取自@ypercube 选择的答案??这似乎不太有用。

上述上下文中的 FROM 别名不会提供真正的好处,除非您是

  • 依赖部分别名(不别名整个表)
  • 这取决于升序列排序
  • 你的表有超过三列(或者你可以在 from 子句中明确地写出来)。

这样做似乎依赖于常规t.*堆叠的危害,并增加了晦涩。那么什么时候FROM别名有用呢?

postgresql alias

6
推荐指数
1
解决办法
1233
查看次数

模式所有者的隐式权限

我对 Postgres 中的模式所有者感到困惑。

当我使用AUTHORIZATION关键字定义的所有者创建模式时,所有者可以在该模式中创建对象(pgAdmin4 中的该模式没有显示显式权限)。

但是,当我将架构所有者更改为另一个角色时,此角色无法在该架构中创建对象(除非我明确授予USAGECREATE)。

我想,该架构所有者具有对架构执行任何操作的隐式特权。更改架构所有者芯片的正确方法是什么?

postgresql permissions

6
推荐指数
1
解决办法
7206
查看次数

如何将值传递给不是列的 ON CONFLICT 子句?

基本上,我试图在 postgresql 中的单个命令中进行多次插入,其中我ON CONFLICT有一个 per-insert 参数。

这是查询(格式为psycopg2):

INSERT INTO
    web_pages
    (url, starturl, netloc, distance, is_text, 
     priority, type, addtime, state)
VALUES
    (%(url)s, %(starturl)s, %(netloc)s, %(distance)s, %(is_text)s, 
      %(priority)s, %(type)s, %(addtime)s, %(state)s)
ON CONFLICT (url) DO
    UPDATE
        SET
            state           = EXCLUDED.state,
            starturl        = EXCLUDED.starturl,
            netloc          = EXCLUDED.netloc,
            is_text         = EXCLUDED.is_text,
            distance        = LEAST(EXCLUDED.distance, web_pages.distance),
            priority        = GREATEST(EXCLUDED.priority, web_pages.priority),
            addtime         = LEAST(EXCLUDED.addtime, web_pages.addtime)
        WHERE
        (
                web_pages.ignoreuntiltime < %(ignoreuntiltime)s
            AND
                web_pages.url = EXCLUDED.url
            AND
                (web_pages.state = 'complete' OR web_pages.state = 'error') …
Run Code Online (Sandbox Code Playgroud)

postgresql upsert postgresql-9.6

6
推荐指数
1
解决办法
5697
查看次数

如何从 PostgreSQL 时间戳中获取时区

这可能是一个非常简单的问题,但对 Google 来说很难,因为它匹配了太多不同的问题。

我想获取保存在我的数据库中的时间戳的时区(或偏移量)。

例如,现在在我的数据库中,我有

     expired_at      
---------------------
 2018-04-28 00:00:00
 2018-03-28 08:00:00
 2018-02-28 05:00:00
Run Code Online (Sandbox Code Playgroud)

我想找到所有expired_at具有 PST 偏移量的内容。

所以我的伪代码是这样的

SELECT expired_at FROM table WHERE expired_at IS IN TIMEZONE('PST')

我能得到一些帮助吗。谢谢!

附注。基本上,我试图通过查找所有 UTC 时间戳并将它们更新为 PST 来解决数据完整性问题。数据库现在混杂着许多不同的时区。

postgresql

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

使用 Postgres JSONB 值数组而不是仅使用 JSONB 有什么意义吗?

是否有任何理由使用 JSONB 值数组而不仅仅是原始 JSONB?

我的用例是我需要在 JSON 对象列表中存储自定义表单定义。我的问题是将其存储为原始 JSON 值还是将其拆分为单独的 JSONB 对象会更好。

每种解决方案的优缺点是什么?

postgresql array json

6
推荐指数
1
解决办法
4062
查看次数

多个相关表的全文搜索:索引和性能

我们有以下数据库结构

CREATE TABLE objects (
    id       int   PRIMARY KEY,
    name     text,
    address  text
);

CREATE TABLE tasks (
    id int           PRIMARY KEY,
    object_id int    NOT NULL,
    actor_id int     NOT NULL,
    description text
);

CREATE TABLE actors (
    id   int  PRIMARY KEY,
    name text
);
Run Code Online (Sandbox Code Playgroud)

用户输入以空格分隔的单词列表(基本上是搜索词),我们必须搜索满足以下条件的任务:如果每个搜索词在任务描述的串联中至少出现一次,则该任务是“匹配”,其关联对象的名称和地址以及关联参与者的名称。

现在,如果我们不关心性能,我们可以这样做(给定查询“foo bar”):

SELECT t.id, t.description
FROM tasks AS t
INNER JOIN actors AS a ON t.actor_id = a.id
INNER JOIN objects AS o ON t.object_id = o.id
WHERE to_tsvector(concat_ws(' ', t.description, o.name, o.address, a.name)) @@ …
Run Code Online (Sandbox Code Playgroud)

postgresql performance full-text-search postgresql-performance

6
推荐指数
2
解决办法
6365
查看次数

如何解析 PostgreSQL 中的地址?

例如,假设我想为 Chicken Ranch 解析这些地址

Chicken Ranch
10511 Homestead Rd
Pahrump, NV 89061

Chicken Ranch
1600 Pennsylvania Avenue
NW Washington, D.C. 20500
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我都想摆脱RdAvenue。例如,在第一种情况下,我想获得“Homestead”,而在第二个“Pennsylvania”中。不过,并非每个地址都有这样的名称。

postgresql address

6
推荐指数
1
解决办法
4458
查看次数

如何使用隐式 DISTINCT 创建聚合函数,如 sum?

我们有一个 ERP 系统,它允许使用聚合(例如SUM(foo))但不允许使用 DISTINCT(例如SUM(DISTINCT foo).

是否可以创建一个聚合函数 ( SUM_DISTINCT),它返回与 相同的结果SUM(DISTINCT foo),所以SUM_DISTINCT(foo) = SUM(DISTINCT foo)

postgresql aggregate distinct

6
推荐指数
1
解决办法
3302
查看次数

WAL 存档:失败(请确保 WAL 运输已设置)

我正在尝试将 Barman 配置为备份。当我做一个barman check replica我不断得到:

Server replica:
WAL archive: FAILED (please make sure WAL shipping is setup)
PostgreSQL: OK
superuser: OK
wal_level: OK
directories: OK
retention policy settings: OK
backup maximum age: FAILED (interval provided: 1 day, latest backup age: No available backups)
compression settings: OK
failed backups: OK (there are 0 failed backups)
minimum redundancy requirements: FAILED (have 0 backups, expected at least 2)
ssh: OK (PostgreSQL server)
not in recovery: FAILED (cannot perform exclusive backup on …
Run Code Online (Sandbox Code Playgroud)

postgresql barman postgresql-9.6

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