我正在使用 pg_trgm 运行查询,但在使用符号差异进行搜索时得到很多 1 匹配。我有以下查询:
SELECT my_column, similarity('$ Hello', my_column) AS sml
FROM my_table
WHERE my_column % '$ Hello'
ORDER BY sml DESC, my_column;
Run Code Online (Sandbox Code Playgroud)
在 中my_table,我有以下内容:
- Hello
? Hello
| Hello
$ Hello
! Hello
!? Hello
Run Code Online (Sandbox Code Playgroud)
它们都以 1 的相似性匹配返回。我是否需要转义“$”或类似的内容?
我读过:使用复合类型创建新表
我有一个名为 的表locations,例如用 lat 表示对象。和长。坐标。
在另一个表中,我声明了一个类型的列locations(只是为了好玩,而不是试图变得聪明),即
CREATE TABLE XXX (..., some_column locations, ...);
Run Code Online (Sandbox Code Playgroud)
现在我在问自己这意味着什么,是否可以locations在其中存储一个对象。
这就是我试图做的:
SELECT pg_typeof(ROW(x)) FROM locations x LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
返回record. 我尝试将其转换为locations,即
SELECT ROW(x)::locations FROM locations X LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
这产生
Run Code Online (Sandbox Code Playgroud)ERROR: cannot cast type record to locations
接下来我尝试type_location根据locations表的列定义一个复合类型,并基于它创建一个类型化表( CREATE TABLE ... OF ...)。我仍然无法做到ROW(x)::locations。
最终,我试图将一个值存储到XXX类型locations(或type_location)表中,但我不明白我的推理哪一部分是错误的。
PS:我并不是要使用这种结构来创建一个健全的数据库设计,而实际上只是在玩弄 PostgreSQL 及其类型系统。
我有一个包含文本列的表格,我想按word搜索,而不是lexeme。更重要的是,我想按单词而不是词素进行索引。我们有大量代码引用的错误转储,它们不适用于任何自然语言词典。
Postgres 有没有办法让 FTS 按单词边界解析而不将单词解析为词素?如果我必须定义一个边界字符列表和一个跳过词目录,那可能没问题。这是否需要制作某种自定义词典,还是已经有类似的东西可用?
我一直认为我错过了一些明显的东西,然后找不到它。
目前,trigram 索引还可以,但我真的更喜欢文本的唯一关键字解析器。
RDS 上的 Postgres 11.4。
我有两个进程并行执行这样的代码:
begin;
update foos set unread=false where owner_id=123 and unread=true;
commit;
Run Code Online (Sandbox Code Playgroud)
这会导致死锁。
我对导致死锁的原因的理解就像这个问题中描述的场景,“交织” UPDATE 语句以不同的顺序更新两个不同的行。我不明白单个 UPDATE 语句如何导致死锁。我无法在我的开发环境中使用两个并行 psql 会话来复制死锁场景。我为什么不能复制它的猜测:
这个单一的 UPDATE 是否有可能造成死锁?
timestamp with time zone对比timestamp without time zone:
我知道这timestamptz与在数据库中保存值时添加的时间戳无时区+(时区差)相同。也就是说,在数据库中,当存储时,它们都是无法区分的。
比如说,我决定只使用timestamp without time zone,即使是在推荐的情况下timestamp with time zone。我网站的用户可以记住,我和他们将始终使用 UTC 进行操作,即使我们碰巧处于不同的时区,效果会timestamp without time zone很好且没有缺陷吗?
假设我有一个表,其描述如下:
create table my_table (
id serial,
create_date timestamp with time zone default now(),
data text
);
Run Code Online (Sandbox Code Playgroud)
和这样的查询:
select * from my_table
where create_date >= timestamp with time zone 'yesterday'
Run Code Online (Sandbox Code Playgroud)
理论上哪个索引会更快,为什么?
create index index_a on my_table (create_date);
create index index_b on my_table (create_date DESC);
Run Code Online (Sandbox Code Playgroud) 我在 PostgreSQL 13 中有这个表:
CREATE TABLE public."domain" (
id int8 NOT NULL GENERATED ALWAYS AS IDENTITY,
domain_name varchar NOT NULL,
-- more columns
expire_date timestamp NULL,
days_before_trigger int4 NOT NULL DEFAULT 14
);
Run Code Online (Sandbox Code Playgroud)
现在我想添加一个生成的列notify_trigger_date,派生自expire_date减days_before_trigger,以记录我的网站 url ssl 证书到期日期。如何自动生成该列?
它看起来像这样:
notify_trigger_date = expire_date - 7 day
Run Code Online (Sandbox Code Playgroud)
我正在尝试像这样实现它:
ALTER TABLE "domain" ADD COLUMN notify_trigger_date timestamp
GENERATED ALWAYS AS ((expire_date::timestamp - '1 day')) STORED;
Run Code Online (Sandbox Code Playgroud)
我不知道如何1 day用天数替换days_before_trigger?此命令运行时出错:
Run Code Online (Sandbox Code Playgroud)SQL Error [22007]: ERROR: invalid input syntax for …
到目前为止,我的 PostgreSQL 应用程序中的所有查询都很快。在过去的几天里,有时一个查询需要几个小时。索引是健康的,因为在 dump、restore、vacuum -z 之后,它仍然是一样的:查询需要几个小时。
EXPLAIN VERBOSE SELECT DISTINCT "modwork_beleg"."direction"
FROM "modwork_beleg"
LEFT OUTER JOIN "modwork_isu_isu_pkunde" ON ("modwork_beleg"."id" = "modwork_isu_isu_pkunde"."beleg_id")
LEFT OUTER JOIN "modwork_isu_isu_vknr" ON ("modwork_beleg"."id" = "modwork_isu_isu_vknr"."beleg_id")
LEFT OUTER JOIN "modwork_isu_isu_gpnr" ON ("modwork_beleg"."id" = "modwork_isu_isu_gpnr"."beleg_id")
WHERE ("modwork_beleg"."state" IN (E'neu', E'inarbeit', E'wiedervorlage')
AND (
"modwork_isu_isu_pkunde"."pkunde" = 90237758
OR
"modwork_isu_isu_vknr"."vknr" = 254400297729
OR
"modwork_isu_isu_gpnr"."gpnr" = 1001030921
));
Run Code Online (Sandbox Code Playgroud)
查询计划:
HashAggregate (cost=36409.29..36409.30 rows=1 width=3)
Output: modwork_beleg.direction
-> Merge Right Join (cost=28836.70..36409.29 rows=1 width=3)
Output: modwork_beleg.direction
Merge Cond: (modwork_isu_isu_vknr.beleg_id = modwork_beleg.id)
Filter: ((modwork_isu_isu_pkunde.pkunde …Run Code Online (Sandbox Code Playgroud) 我收到此错误:
当我尝试执行以下查询时出现:
with expensive_service as (
select s1.*
from service s1, service s2
where s1.price > s2.price
)
select *
from service except expensive_service;
Run Code Online (Sandbox Code Playgroud)
我试图实现WITH ... AS(链接到 PostgreSQL 文档)。
此查询为我提供了所需的输出:
select *
from service except (
select s1.*
from service s1, service s2
where s1.price > s2.price
)
Run Code Online (Sandbox Code Playgroud)
任何指导我错误所在的帮助将不胜感激!
我试过这个:
create or replace function c3 (arg char(3))
returns void
language plpgsql as
$$
begin
raise notice 'Value: %', arg;
end;
$$;
Run Code Online (Sandbox Code Playgroud)
但它接受三个以上的字符:
select c3('1234');
Run Code Online (Sandbox Code Playgroud) postgresql ×10
concurrency ×1
cte ×1
datatypes ×1
deadlock ×1
except ×1
functions ×1
index ×1
index-tuning ×1
interval ×1
join ×1
performance ×1
plpgsql ×1
timestamp ×1
timezone ×1
transaction ×1
update ×1