这很快(49ms):
v_cpf_numerico := ext.uf_converte_numerico(new.nr_cpf);
select cd_cliente into v_cd_cliente
from central.cliente where nr_cpf_cnpj = v_cpf_numerico;
Run Code Online (Sandbox Code Playgroud)
这很慢(15 秒):
select cd_cliente into v_cd_cliente
from central.cliente where nr_cpf_cnpj = ext.uf_converte_numerico(new.nr_cpf);
Run Code Online (Sandbox Code Playgroud)
功能:
create or replace function ext.uf_converte_numerico(_input varchar(30)) returns bigint
as
$$
begin
_input := regexp_replace(_input, '[^0-9]+', '', 'g');
if _input = '' then
return null;
end if;
return cast(_input as bigint);
end
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
我使用的是 PostgreSQL 12。
为什么第二个变体很慢?
postgresql performance functions postgresql-12 query-performance
PostgreSQL 中是否有标准函数(从 12.x 开始)将数据库列中的许多 jsonb 对象连接或合并为单个 jsonb 对象?
我知道有一个|| 自 PostgreSQL 9.5 起合并两个jsonb 对象的运算符。但我需要从一列合并许多 jsonb 对象。除非我遗漏了什么,否则链接的文档似乎没有。
跟进我关于 Postgres 12 中的某些查询比 11 中的查询慢的问题,我认为我能够缩小问题的范围。似乎基于函数值的递归 CTE 是有问题的地方。
我能够分离出一个相当小的 SQL 查询,它在 Postgres 12.1 上运行的时间比在 Postgres 11.6 上运行的时间要长得多,例如 Postgres 12.1 中的大约 150 毫秒与 Postgres 11.6 中的大约 4 毫秒。我能够在各种系统上重现这种现象:在 VirtualBox 中的多个 VM 上;通过两台不同物理机器上的 Docker。(有关 docker 命令,请参阅附录)。然而,奇怪的是,我无法在https://www.db-fiddle.com/上重现它(在那里看不到区别,两者都很快)。
现在进行查询。首先,我们创建这个简单的函数
CREATE OR REPLACE FUNCTION public.my_test_function()
RETURNS SETOF record
LANGUAGE sql
IMMUTABLE SECURITY DEFINER
AS $function$
SELECT
1::integer AS id,
'2019-11-20'::date AS "startDate",
'2020-01-01'::date AS "endDate"
$function$;
Run Code Online (Sandbox Code Playgroud)
然后对于实际查询
WITH "somePeriods" AS (
SELECT * FROM my_test_function() AS
f(id integer, "startDate" date, "endDate" …Run Code Online (Sandbox Code Playgroud) postgresql cte recursive postgresql-12 postgresql-performance
我一直在阅读有关 PostgreSQL 的新 CTE 功能 - MATERIALIZED 或 NOT MATERIALIZED 关键字 - 它可以在某些情况下提供额外的优化机会,前提是这样做是安全的。对此PostgreSQL 更新的评论如下:
...用户可以通过指定 MATERIALIZED 强制旧行为 [LESS OPTIMIZED];当查询故意使用WITH作为优化栅栏以防止计划选择不当时,这主要有用。
我一直想知道,考虑到在某种情况下使用 CTE 优化(不是 MATERIALIZED 关键字)是安全的,在这种情况下,优化程度较低的“MATERIALIZED”关键字可以“防止错误的计划选择”,如引用所述或提供更好的计划?
最后一点,这是/sf/ask/4249081091/上的问题的副本。我得到的建议是这个问题更适合这个社区,因此在这里重新发布。
有没有办法提前确定VACUUM FULL特定表上的多少磁盘空间将返回给操作系统?因此,您可以决定这样做是否值得付出代价。
如果有一个简单的查询来为数据库/服务器中的每个表执行此操作(而不是单独执行每个表),则奖励。
我有一个 SQL Server 数据库,我正在将其迁移到 PostgreSQL 12.0。
我已成功迁移架构和表。连接数据库的应用程序很大程度上依赖于存储过程,这些存储过程也需要转换为PostgreSQL。
不幸的是,我使用的工具不能转换存储过程。关于我应该如何解决这个问题有什么想法或者有一个工具可以做到这一点吗?
我有一个包含大约 1000 万行的表,其中包含一个主键和一个定义在其上的索引:
create table test.test_table(
date_info date not null,
string_data varchar(64) not null,
data bigint
primary key(date_info, string_data));
create index test_table_idx
on test.test_table(string_data);
Run Code Online (Sandbox Code Playgroud)
我有一个使用了的查询test_table_idx:
select distinct date_info from test.test_table where string_data = 'some_val';
Run Code Online (Sandbox Code Playgroud)
问题是第一次运行查询最多可能需要 20 秒,而在任何后续运行中都需要 < 2 秒。
有没有办法将整个索引加载到内存中,而不是在第一次访问时获取数据库加载信息?
我在 PostgreSQL 12 数据库中有一个包含数百万条记录的表,从 11 升级到 12 后,一些查询开始表现得很糟糕。他们从大约 1 秒缩短到大约 5 分钟。我尝试重建所有索引、清理以及所有常见的 Postgres 容易实现的目标,但性能仍然很糟糕。
这是查询:
SELECT id, activity_count
FROM user
WHERE (search_index) @@ (to_tsquery('pg_catalog.english', '''1234567890'':*') AND active = true
ORDER BY activity_count DESC LIMIT 101
Run Code Online (Sandbox Code Playgroud)
换句话说,找到与给定帐号匹配的所有活跃用户,并从最活跃到最不活跃进行排序。
此查询大约需要 5 分钟才能返回 2 条记录。有什么不对劲。
该列search_index是一个 tsvector,存储表的各个文本字段中的所有关键字(只是帐户编号、名称等)。
我为此列创建了一个 GIN 索引:
CREATE INDEX user_search_index_gin
ON public.user USING gin
(search_index)
TABLESPACE pg_default;
Run Code Online (Sandbox Code Playgroud)
我还有一个该active列的索引:
CREATE INDEX user_active
ON public.user USING btree
(active ASC NULLS LAST)
TABLESPACE pg_default;
Run Code Online (Sandbox Code Playgroud)
我有一个有序索引activity_count:
CREATE INDEX user_activity_count …Run Code Online (Sandbox Code Playgroud) postgresql statistics upgrade postgresql-12 query-performance
我有一个由 PostgreSQL v12 客户端附带生成的大转储文件pg_dump,它是自定义格式而不是纯 sql 文本。服务器的版本也是 PostgreSQL v12。
现在我需要将文件重新加载到 PostgreSQL v11 服务器中,并收到一条错误消息:
unrecognized configuration parameter "default_table_access_method"
Run Code Online (Sandbox Code Playgroud)
我猜测这个参数是PG12引入的,所以PG11无法识别它,即使我使用12版本的pg_restore.
由于该文件很大且采用二进制格式,因此我无法编辑它以手动删除该行。
我pg_restore test_file -f plain.sql使用测试转储文件对此进行了测试,看起来可以正常工作,并且我可以从纯 SQL 文件中删除该行。但真实的转储文件约为 30GB,从二进制文件扩展的纯 SQL 文件可能更大(工作数据库占用 300GB 磁盘空间)。
有没有办法,我可以干净地将其重新加载到 PG11 中,而无需“SET default_table_access_method = heap;”行?
其实下面这些都可以忽略,因为都是默认值:
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security …Run Code Online (Sandbox Code Playgroud) Postgres 12+ 支持生成列:https://www.postgresql.org/docs/current/ddl- generated-columns.html
从文档来看,语法似乎受到限制 - 它强制人们显式命名生成列所依赖的列。
CREATE TABLE people (
...,
height_cm numeric,
height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED
);
Run Code Online (Sandbox Code Playgroud)
有没有办法将整行传递给生成函数?就像是
CREATE TABLE people (
...,
height_cm numeric,
height_in numeric GENERATED ALWAYS AS generator_function(current_row) STORED
);
Run Code Online (Sandbox Code Playgroud) postgresql-12 ×10
postgresql ×9
cte ×2
functions ×2
aggregate ×1
cache ×1
downgrade ×1
index ×1
json ×1
migration ×1
performance ×1
pg-dump ×1
pg-restore ×1
recursive ×1
statistics ×1
upgrade ×1
vacuum ×1