一年又一年,Postgres 已成为世界上最受喜爱和最受信任的数据库 — Postgres 17将变得更好。即将发布的版本在开发人员体验和性能方面都有所改进。
Postgres 17 中的 3 大特性
#01
具有 RETURNING 支持的 MERGE 命令
它可以帮助需要处理条件数据修改而无需处理多个查询的应用程序开发人员。
Postgres 17在 Postgres 15 中引入的MERGE命令的基础上更进一步,增加了对该子句的支持。这一改进允许开发人员在单个步骤中检索并返回由该操作修改的行,从而减少了对额外查询的需求并简化了复杂的工作流程。您将能够编写更简洁、更高效的 SQL,尤其是在涉及条件插入、更新或删除的场景中。RETURNING MERGE
例子:
CREATE TABLE hero (
id SERIAL PRIMARY KEY,
first_name text,
last_name text,
hero_name text UNIQUE
);
-- Insert new hero or update existing one based on hero_name
MERGE INTO hero h
USING (VALUES ('Wade', 'Wilson', 'Deadpool')) v(first_name, last_name, hero_name)
ON h.hero_name = v.hero_name
WHEN MATCHED THEN
UPDATE SET first_name = v.first_name, last_name = v.last_name
WHEN NOT MATCHED THEN
INSERT (first_name, last_name, hero_name)
VALUES (v.first_name, v.last_name, v.hero_name)
RETURNING merge_action(), *;
-- returns:
-- merge_action | id | first_name | last_name | hero_name
-- -------------|----|------------|-----------|-----------
-- UPDATE | 1 | Wade | Wilson | Deadpool
如果匹配,此代码会更新现有英雄的名字和姓氏hero_name,如果未找到匹配项,则插入新英雄。该RETURNING子句将返回操作结果以及英雄的数据,从而更轻松地一步处理修改后的行。
#02
增强的 JSON 函数
它满足了在 Postgres 中管理半结构化数据的日益增长的需求,并提供了更直接的方法来处理 JSON。
Postgres 17 改进了搜索、提取和操作 JSON 数据的方式,增加了对新 JSON 路径函数的支持,例如JSON_TABLE。此函数允许您将 JSON 数据直接转换为关系表格式,从而更容易在 JSON 数据上使用 SQL 查询,而无需先手动解压或转换它:
SELECT *
FROM json_table(
'[
{"product": "Laptop", "details": {"price": 1200, "stock": 25}},
{"product": "Smartphone", "details": {"price": 800, "stock": 50}},
{"product": "Tablet", "details": {"price": 500, "stock": 40}}
]',
'$[*]'
COLUMNS (
product_name TEXT PATH '$.product',
price INT PATH '$.details.price',
stock INT PATH '$.details.stock'
)
) AS jt;
product_name | price | stock
--------------|-------|-------
Laptop | 1200 | 25
Smartphone | 800 | 50
Tablet | 500 | 40
#03
提高性能
谁不喜欢更快的查询?很高兴看到 Postgres 解决了它的一些弱点,比如真空操作。
此版本引入了多项改进,可提高查询性能和操作效率,包括改进并行查询处理、vacuum 过程和 B-tree 索引性能。Vacuum 现在采用新的内部数据结构,可将内存使用量减少多达 1/20,并通过取消之前的 1GB 内存上限来实现更大的灵活性。此外,通过优化 IN 子句的处理,B-tree 索引性能得到提升,从而可以更快地执行涉及大量值列表的操作的查询。
#PG证书#PG考试#postgresql初级#postgresql中级#postgresql高级