我有一个名为 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) 在 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 UPDATE在SELECTCTE 中做就足够了吗?
抱歉,如果我没有在这里说清楚:我并不是想“看到”这些并发修改,我想阻止它们,即一旦计算完成SELECT,没有其他查询可能会修改该行,直到计算UPDATE …
我在 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?有什么方法可以仅在成功插入时增加价值?
我有一个分区表...
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
我们计划在 RDS 上的 PostgreSQL 13.4 中使用列表/范围分区来对约 5 亿行的数据集进行分区。我们的读取访问模式应该只需要每个查询访问非常少量的分区。我们希望防止需要访问每个分区的读取查询,以便该策略可以随着数据量的增长而很好地发挥作用。是否可以在数据库层强制执行任何检查或防护,以拒绝/阻止/失败需要包含每个分区的查询计划的查询?
本质上,我希望这体现为确保子句中有足够的过滤,WHERE以便查询规划器知道它不需要路由到每个分区。我们可以检查来自业务逻辑的查询示例的查询计划,但如果能够自动执行它就更好了。理想情况下,如果开销不是太高,我们可以在生产中强制执行,但在较低的环境中执行此操作将是积极的一步。对于如何实现这一点,有什么选择或建议吗?提前谢谢了。
在我的应用程序服务器中,我想使用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
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。
我正在使用 Fivetran 作为 ETL 层来设置数据仓库。源数据库之一是 AWS RDS Postgres 实例。
我已将 Postgres 实例配置为使用 test_decoding 插件执行 WAL 的逻辑复制。在办公时间内一切似乎都工作正常,但是在办公时间之外,当没有执行查询时,最旧的复制槽滞后大小正在增加,尽管 Fivetran 连接器执行同步。
您可以在下图中看到这一点。在红色框中,复制槽滞后大小正在增加(上图),而同步时刻每小时都会发生(下图)。我期望出现如绿框中所示的图表,复制槽滞后大小在同步时刻周围正在减小。
我就这个问题联系了 Fivetran,但他们还无法找出问题所在,因此我向社区询问。
我使用 Postgres 版本 13.3 和以下自定义配置:
max_slot_wal_keep_size:20000rds.logical_replication:1wal_sender_timeout:0(Fivetran 要求)其余的配置都是默认的。
我还检查了其他问题,只有一个可能接近https://dba.stackexchange.com/a/103806/235086,但我不确定它是否适用于这里,因为它是关于秒数而不是大小的滞后。
我有复杂的计算视图,但一行会产生问题
ROUND((((latest_revenue::numeric/ oper_reve_3y_old::numeric) ^ (1/3::numeric)) -1::numeric)*100::numeric)
Run Code Online (Sandbox Code Playgroud)
当我执行查询时,计算工作正常,当我在视图中使用它时,一切正常,但是如果我尝试使用此语句创建物化视图,则会出现错误
“负数的非整数幂会产生复杂的结果”
有什么方法可以在物化视图中使用它吗?或者是否有一些解释为什么这仅适用于物化视图?
我正在尝试在 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 实例突然异常停止,并且数据是脏的并且没有保存在 RAM 或 WAL 中。那样的话会发生什么?
我可以从哪里恢复这些数据?如果服务器也关闭,在这种情况下脏数据会发生什么?
是否有任何单独的文件来存储脏数据以进行恢复?
postgresql database-design postgresql-performance postgresql-13 postgresql-14
我有10-15个大表,5GB到30GB。其余的都小于1GB。有些表数据很大,每天会产生 500 000 个死元组。大约 7 天后,当死亡元组超过 350 万个时,自动清理就会开始。该数据库大约有 60 个表。这里数据库的阈值是:20%。
我想将 autovacuum 阈值从 20% 更改为 1%。对系统性能有什么影响(因为对于较小的表,它会频繁运行)。maintanance_work_mem 和 work_mem 参数值应该是什么?
我目前安装了 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-13 ×13
postgresql ×12
collation ×2
partitioning ×2
amazon-rds ×1
count ×1
cte ×1
locking ×1
replication ×1
sequence ×1
update ×1
upsert ×1
utf-8 ×1