标签: postgresql-13

如何更新 jsonb 字段的属性值?

我有一个名为 attr 字段的 jsonb 类型,其中包含以下内容:

{ 
  "pid": 1,
  "name": "john",
  "is_default": true
 }
Run Code Online (Sandbox Code Playgroud)

如何将 is_default 更改为 false?

我试着跑到下面,但没有成功。

update attr set attr ->> 'is_default' = false where sales_type = 2
Run Code Online (Sandbox Code Playgroud)

postgresql-13

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

我是否需要在 UPDATE 的 CTE 中显式 FOR UPDATE 锁?

在 Postgres 13 中,我有一个经常更新的表。然而,更新查询相当复杂,并且多次使用相同的值。因此,使用 CTE 似乎是一件非常合乎逻辑的事情。

一个简化的示例如下所示:

WITH my_cte AS (
    SELECT
          my_id,
          CASE WHEN my_value1 > 100 THEN 50 ELSE 10 END AS my_addition     
    FROM my_table      
    WHERE my_id = $1
)
UPDATE my_table
        SET my_value1 = my_table.my_value1 + my_cte.my_addition,
            my_value2 = my_table.my_value2 + my_cte.my_addition
FROM my_cte
WHERE my_table.my_id = my_cte.my_id
Run Code Online (Sandbox Code Playgroud)

现在我想知道:如果在SELECTCTE 和 之间UPDATE,表被另一个查询更新,my_value1从而发生变化,那么当发生这种情况时,were 的计算my_addition就会变得过时且错误,会发生什么UPDATE。会出现这样的情况吗?或者 Postgres 是否自动设置隐式锁?

如果 Postgres 在这里没有魔法,我需要自己处理它:FOR UPDATESELECTCTE 中做就足够了吗?

抱歉,如果我没有在这里说清楚:我并不是想“看到”这些并发修改,我想阻止它们,即一旦计算完成SELECT,没有其他查询可能会修改该行,直到计算UPDATE …

postgresql cte locking update postgresql-13

9
推荐指数
1
解决办法
3747
查看次数

尽管使用“冲突时不执行任何操作”,为什么串行主键仍会递增?

我在 PostgreSQL 13 中有下表:

表名:新表

field       type 
-----       ----    
Seq         bigserial   
code        varchar     
Run Code Online (Sandbox Code Playgroud)

Seq是主键(自增)
Code是唯一键索引

Insert Into newtable (Code) Values ('001') On Conflict(Code) Do Nothing   --> Seq value is 1
Insert Into newtable (Code) Values ('001') On Conflict(Code) Do Nothing
Insert Into newtable (Code) Values ('001') On Conflict(Code) Do Nothing

Insert Into newtable (Code) Values ('002') On Conflict(Code) Do Nothing   --> Seq value is 4
Run Code Online (Sandbox Code Playgroud)

为什么是序列4?有什么方法可以仅在成功插入时增加价值?

postgresql sequence upsert postgresql-13

8
推荐指数
2
解决办法
7236
查看次数

如何通过子查询或连接来利用分区修剪?

我有一个分区表...

CREATE TABLE erco.rtprices
(
    scedtime timestamp with time zone NOT NULL,
    node_id integer NOT NULL,
    lmp numeric(12,6),
    CONSTRAINT rtprices_pkey PRIMARY KEY (scedtime, node_id)
) PARTITION BY LIST (node_id);
Run Code Online (Sandbox Code Playgroud)

每个都有node_id自己的分区。

如果我进行直接查询(第一个版本),例如:

explain select scedtime, lmp 
from erco.rtprices
where node_id = 11111
Run Code Online (Sandbox Code Playgroud)

然后该计划仅对rtprices_11111分区进行顺序扫描。 这就是我要的。

但是,如果我执行(第二个版本)查询,例如

explain select scedtime, lmp 
from erco.rtprices
inner join erco.nodes using (node_id)
where nodename = 'somename'
Run Code Online (Sandbox Code Playgroud)

那么该计划包括对每个分区进行顺序扫描,即使此查询与第一个查询一样有限制。

我尝试了上述查询的另一种形式(第三个版本)。

explain select scedtime, lmp 
from erco.rtprices
where node_id = (select node_id from erco.nodes where nodename='somename') …
Run Code Online (Sandbox Code Playgroud)

postgresql execution-plan partitioning postgresql-performance postgresql-13

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

PostgreSQL – 是否可以阻止或拒绝需要所有分区的查询?

我们计划在 RDS 上的 PostgreSQL 13.4 中使用列表/范围分区来对约 5 亿行的数据集进行分区。我们的读取访问模式应该只需要每个查询访问非常少量的分区。我们希望防止需要访问每个分区的读取查询,以便该策略可以随着数据量的增长而很好地发挥作用。是否可以在数据库层强制执行任何检查或防护,以拒绝/阻止/失败需要包含每个分区的查询计划的查询?

本质上,我希望这体现为确保子句中有足够的过滤,WHERE以便查询规划器知道它不需要路由到每个分区。我们可以检查来自业务逻辑的查询示例的查询计划,但如果能够自动执行它就更好了。理想情况下,如果开销不是太高,我们可以在生产中强制执行,但在较低的环境中执行此操作将是积极的一步。对于如何实现这一点,有什么选择或建议吗?提前谢谢了。

postgresql partitioning postgresql-13

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

COUNT(1) OVER (PARTITION BY NULL) 的性能损失

在我的应用程序服务器中,我想使用LIMIT和对数据集进行分页OFFSET,并另外将数据集的总数返回给用户。

而不是对数据库进行两次远程调用:

select count(1) as total_count from foo;
select c1 from foo;
Run Code Online (Sandbox Code Playgroud)

我认为在单个数据库调用中完成此操作会更明智:

select c1, count(1) over (partition by null) from foo;
Run Code Online (Sandbox Code Playgroud)

但是,与不使用窗口函数相比,添加此窗口函数会导致执行时间长一个数量级。

我觉得这很令人惊讶,因为类似的时间select count(1) from foo只需要两倍的时间select c1 from foo。然而,将其转换为窗口函数会导致性能下降。

此外,使用以下使用子查询的替代方案非常快:

select c1, (select count(1) from foo) as total_count from foo;
Run Code Online (Sandbox Code Playgroud)

我本来期望 postgresql 能够优化partition by null

我在 Oracle 中尝试过这一点,发现了类似的性能损失。

如何解释为什么这里会出现性能损失?对于核心 postgresql 开发人员来说,进行更改以优化这一点是否相对容易,甚至值得,例如通过将 PARTITION BY NULL 的窗口函数转换为子查询?


设置:

drop table foo;
create table foo (c1 int);

insert into foo
select i from …
Run Code Online (Sandbox Code Playgroud)

postgresql count window-functions postgresql-performance postgresql-13

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

postgresql 匹配或转换 utf-8 变体字符串

Postgres 13

我正在寻找一种在 postgresql 中搜索可能具有变体字符表示形式的 UTF-8 文本的方法(正确的术语是什么?即vs )。life

我遇到匹配变体字符的问题,请考虑

-- This works as expected
select 'life' ilike '%life%' matches 

-- I would like to also be able to match against this source text like this
select '' ilike '%life%' matches
Run Code Online (Sandbox Code Playgroud)

请注意,有无数的变体,我此时并不特别关心与非 ascii 可表示字符的匹配,也就是说,我认为只要最终与 匹配,我就可以从 utf-8 到 ascii 有损转换life

postgresql collation utf-8 string-searching postgresql-13

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

即使 Fivetran 连接器保持同步,RDS Postgres 最旧的复制延迟在不活动期间也会增加

我正在使用 Fivetran 作为 ETL 层来设置数据仓库。源数据库之一是 AWS RDS Postgres 实例。

我已将 Postgres 实例配置为使用 test_decoding 插件执行 WAL 的逻辑复制。在办公时间内一切似乎都工作正常,但是在办公时间之外,当没有执行查询时,最旧的复制槽滞后大小正在增加,尽管 Fivetran 连接器执行同步。

您可以在下图中看到这一点。在红色框中,复制槽滞后大小正在增加(上图),而同步时刻每小时都会发生(下图)。我期望出现如绿框中所示的图表,复制槽滞后大小在同步时刻周围正在减小。

replication_log_size_staging_vs_ Fivetran_log

我就这个问题联系了 Fivetran,但他们还无法找出问题所在,因此我向社区询问。

我使用 Postgres 版本 13.3 和以下自定义配置:

  • max_slot_wal_keep_size20000
  • rds.logical_replication1
  • wal_sender_timeout0(Fivetran 要求)

其余的配置都是默认的。

我还检查了其他问题,只有一个可能接近https://dba.stackexchange.com/a/103806/235086,但我不确定它是否适用于这里,因为它是关于秒数而不是大小的滞后。

postgresql replication amazon-rds postgresql-13

3
推荐指数
1
解决办法
4510
查看次数

postgresql物化视图错误:负数的非整数幂产生复杂的结果

我有复杂的计算视图,但一行会产生问题

ROUND((((latest_revenue::numeric/ oper_reve_3y_old::numeric) ^ (1/3::numeric)) -1::numeric)*100::numeric)
Run Code Online (Sandbox Code Playgroud)

当我执行查询时,计算工作正常,当我在视图中使用它时,一切正常,但是如果我尝试使用此语句创建物化视图,则会出现错误

“负数的非整数幂会产生复杂的结果”

有什么方法可以在物化视图中使用它吗?或者是否有一些解释为什么这仅适用于物化视图?

postgresql materialized-view postgresql-13

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

创建新数据库时不会设置排序规则

我正在尝试在 PostgreSQL 13 中设置新数据库的排序规则,但它似乎没有生效:

postgres=# CREATE DATABASE assets ENCODING 'UTF8' LC_COLLATE 'C' LC_CTYPE 'en_US.UTF-8';
CREATE DATABASE
postgres=# \l
                                      List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 assets    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | …
Run Code Online (Sandbox Code Playgroud)

postgresql collation postgresql-13

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

如果PostgreSQL数据库或服务器异常关闭,脏数据会怎样?

假设我的 PostgreSQL 实例突然异常停止,并且数据是脏的并且没有保存在 RAM 或 WAL 中。那样的话会发生什么?

我可以从哪里恢复这些数据?如果服务器也关闭,在这种情况下脏数据会发生什么?

是否有任何单独的文件来存储脏数据以进行恢复?

postgresql database-design postgresql-performance postgresql-13 postgresql-14

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

频繁运行AUTO VACUUM对PostgreSQL数据库有影响吗?

我有10-15个大表,5GB到30GB。其余的都小于1GB。有些表数据很大,每天会产生 500 000 个死元组。大约 7 天后,当死亡元组超过 350 万个时,自动清理就会开始。该数据库大约有 60 个表。这里数据库的阈值是:20%。

我想将 autovacuum 阈值从 20% 更改为 1%。对系统性能有什么影响(因为对于较小的表,它会频繁运行)。maintanance_work_mem 和 work_mem 参数值应该是什么?

postgresql postgresql-performance postgresql-13

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

是否有某种方法可以自动“关注”/预先确定稳定版/GA PostgreSQL 14 的发布日期?

我目前安装了 PostgreSQL 12.x。我正在推迟为 PostgreSQL 14 版本重新安装 Windows,因为出于迷信的原因,我想跳过整个 13 代。是的,你听到的是对的。我真的很害怕运行“13”版本,我已经竭尽全力避免它,永远等待 PG 14。因为它需要一个可怕的转储/恢复,我也想避免这样做两次在“短”连续。

关于 PostgreSQL 14 Beta 的说明

此版本标志着 PostgreSQL 14 的第三个 Beta 版本,并使社区在第三季度末初步接近全面可用。

资料来源:https : //www.postgresql.org/about/news/postgresql-134-128-1113-1018-9623-and-14-beta-3-released-2277/

我还发现了这个:https : //www.postgresql.org/docs/14/release-14.html

发布日期:2021-??-?? (截至 2021-06-20)

这可能会定期更新吗?或将再次它实际上它只是设置释放?

我正在尝试能够自动获取目标日期,以便我可以将 PG 14 版本自动放入我的日历和“倒计时”中,以便我可以期待它。

“第三季度末”的说法听起来好像很快就要到期了,但如果它还没有处于“RC”模式,那对我来说听起来不太有希望。

PS:无论声称13.x多么可靠和无问题,我仍然无法摆脱它会永久破坏我所有数据的感觉。

postgresql postgresql-13

-1
推荐指数
1
解决办法
73
查看次数