我复制了一个数据库,它工作正常,但是当我进入复制数据库时,它显示以下消息:
数据库是使用排序规则版本 2.31 创建的,但操作系统提供版本 2.35。
重建此数据库中使用默认排序规则的所有对象并运行 ALTER DATABASE template1 REFRESH COLLATION VERSION,或使用正确的库版本构建 PostgreSQL。
PgPool 也不适用于此复制数据库,它仅在我删除它时才起作用。
尝试登录时 Pgpool 出现以下错误:
child pid 5286: ERROR: unable to read message kind
child pid 5286: DETAIL: kind does not match between main(53) slot[1] (4e)
Run Code Online (Sandbox Code Playgroud)
同样的消息也出现在 postgresql 日志中。
如何重建我的数据库?
我需要在 Postgres 15 中存储电子邮件(如“ivan@email.com”),能够以不区分大小写的方式搜索它们(“iVaN@email.com”、“IVAN@email.com”等是相同的) ),并能够检索原始电子邮件以将其用于实际发送电子邮件。
处理不区分大小写的数据的建议方法是使用排序规则:
DROP TABLE IF EXISTS test_collation;
DROP COLLATION IF EXISTS case_insensitive;
CREATE COLLATION case_insensitive (PROVIDER = icu, LOCALE = '@colStrength=secondary', DETERMINISTIC = FALSE);
CREATE TABLE test_collation
(
original_email TEXT COLLATE case_insensitive NOT NULL UNIQUE PRIMARY KEY
);
INSERT INTO test_collation (original_email)
VALUES ('IVAN@email.com');
-- This entry fails as expected as a duplicate:
INSERT INTO test_collation (original_email)
VALUES ('ivAn@email.com');
-- Getting the original email provided by the user regardless of case in which it is entered: …
Run Code Online (Sandbox Code Playgroud) 在 PostgreSQL 15 中,当使用隐式排序规则创建索引时,会记录用于该索引的默认排序规则:
默认情况下,索引使用为要索引的列声明的排序规则或要索引的表达式的结果排序规则。具有非默认排序规则的索引对于涉及使用非默认排序规则的表达式的查询非常有用。
但是,在使用默认排序规则(如文档中所述)在列上创建索引后,我们可以更改列的排序规则。根据我的理解,更改列的排序规则不应更改已创建索引的排序规则。
因此,在任何时间点,我们都应该能够查询可能与相应列排序规则不同的索引的实际排序规则。
我们怎样才能做到这一点?
我做了一些测试,但并没有得出结论:
psql (15.3)
Type "help" for help.
postgres=# SELECT version();
version
------------------------------------------------------------------------------
PostgreSQL 15.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 12.2.0, 64-bit
(1 row)
postgres=# CREATE DATABASE test10
TEMPLATE = template0
LOCALE = "C"
ENCODING = 'UTF8';
CREATE DATABASE
postgres=# \c test10
You are now connected to database "test10" as user "postgres".
test10=# CREATE TABLE public.asset(
asset_id uuid NOT NULL,
name text NOT NULL,
CONSTRAINT pk_asset PRIMARY KEY (asset_id)
); …
Run Code Online (Sandbox Code Playgroud) 我需要CREATE MATERIALIZED VIEW ... WITH DATA
从函数/过程执行,但我得到了ERROR: CREATE MATERIALIZED VIEW ... WITH DATA cannot be executed from a function
.
除了使函数返回创建查询文本并复制粘贴以执行它之外,还有其他解决方法吗?
看起来真的很傻,但我想这背后有一个很好的理由......无论如何,这个限制有什么解决方法吗?
我正在运行 postgresql 15。
postgresql stored-procedures materialized-view functions postgresql-15
我正在尝试优化在 PostgreSQL 15.4 中连接两个大表(40MM+ 行)的查询。
\nSELECT files.id, ARRAY_AGG(b.status)\nFROM files\nLEFT OUTER JOIN processing_tasks b\n ON (files.id = b.file_id AND b.job_id = 113)\nWHERE files.round_id = 591\nGROUP BY files.id;\n
Run Code Online (Sandbox Code Playgroud)\nexplain (analyze)
完全相同的查询的两个计划位于:
https://explain.depesz.com/s/cUXB需要 87 秒,使用并行 Seq 扫描processing_tasks.job_id
(默认计划)
https://explain.depesz.com/s/j39G需要 4 秒,使用位图索引扫描processing_tasks.job_id
(当 时set local enable_seqscan = OFF
)
在 中files
,908,275 / 39,000,105 (2.3%) 个元组有round_id=591
; 它是静态的。
\n在 中processing_tasks
,4,026,364 / 60,780,802 (6.6%) 个元组有job_id=113
,并且随着行的插入,这个值将变得越来越常见,可能达到表的 …
postgresql optimization query-performance postgresql-performance postgresql-15