小编Erw*_*ter的帖子

Postgres 三元组匹配对于特定字符表现得很奇怪

我正在使用 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 的相似性匹配返回。我是否需要转义“$”或类似的内容?

postgresql full-text-search pattern-matching

3
推荐指数
2
解决办法
2064
查看次数

PostgreSQL:将行转换为类型

我读过:使用复合类型创建新表

我有一个名为 的表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)

这产生

ERROR:  cannot cast type record to locations
Run Code Online (Sandbox Code Playgroud)

接下来我尝试type_location根据locations表的列定义一个复合类型,并基于它创建一个类型化表( CREATE TABLE ... OF ...)。我仍然无法做到ROW(x)::locations。

最终,我试图将一个值存储到XXX类型locations(或type_location)表中,但我不明白我的推理哪一部分是错误的。

PS:我并不是要使用这种结构来创建一个健全的数据库设计,而实际上只是在玩弄 PostgreSQL 及其类型系统。

postgresql datatypes composite-types

3
推荐指数
1
解决办法
4780
查看次数

Postgres 对单词的全文搜索,而不是词素

我有一个包含文本列的表格,我想按word搜索,而不是lexeme。更重要的是,我想按单词而不是词素进行索引。我们有大量代码引用的错误转储,它们不适用于任何自然语言词典。

Postgres 有没有办法让 FTS 按单词边界解析而不将单词解析为词素?如果我必须定义一个边界字符列表和一个跳过词目录,那可能没问题。这是否需要制作某种自定义词典,还是已经有类似的东西可用?

我一直认为我错过了一些明显的东西,然后找不到它。

目前,trigram 索引还可以,但我真的更喜欢文本的唯一关键字解析器。

RDS 上的 Postgres 11.4。

postgresql full-text-search

3
推荐指数
1
解决办法
1070
查看次数

为什么单个 UPDATE 查询会出现死锁?

我有两个进程并行执行这样的代码:

begin;
update foos set unread=false where owner_id=123 and unread=true;
commit;
Run Code Online (Sandbox Code Playgroud)

这会导致死锁。

我对导致死锁的原因的理解就像这个问题中描述的场景,“交织” UPDATE 语句以不同的顺序更新两个不同的行。我不明白单个 UPDATE 语句如何导致死锁。我无法在我的开发环境中使用两个并行 psql 会话来复制死锁场景。我为什么不能复制它的猜测:

  1. 我误解了导致死锁错误的代码,并且每个事务中实际上有多个 UPDATE 语句
  2. “交织”方面正在发生,但“在”涵盖多行的 UPDATE 语句中,因此很难复制。

这个单一的 UPDATE 是否有可能造成死锁?

postgresql deadlock concurrency transaction update

3
推荐指数
2
解决办法
3415
查看次数

如果 UTC 始终可用,则使用不带时区的时间戳有任何缺点

timestamp with time zone对比timestamp without time zone:

我知道这timestamptz与在数据库中保存值时添加的时间戳无时区+(时区差)相同。也就是说,在数据库中,当存储时,它们都是无法区分的。

比如说,我决定只使用timestamp without time zone,即使是在推荐的情况下timestamp with time zone。我网站的用户可以记住,我和他们将始终使用 UTC 进行操作,即使我们碰巧处于不同的时区,效果会timestamp without time zone很好且没有缺陷吗?

postgresql timestamp timezone

3
推荐指数
1
解决办法
4024
查看次数

B 树索引中支持最近行查询的最佳排序顺序?

假设我有一个表,其描述如下:

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 index index-tuning postgresql-performance

3
推荐指数
1
解决办法
2899
查看次数

如何使用减去天数的表达式添加生成的列?

我在 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?此命令运行时出错:

SQL Error [22007]: ERROR: invalid input syntax for …
Run Code Online (Sandbox Code Playgroud)

postgresql database-design computed-column interval

3
推荐指数
2
解决办法
305
查看次数

查询需要数小时

到目前为止,我的 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)

postgresql performance join

2
推荐指数
1
解决办法
543
查看次数

WITH ... AS 语句未按预期工作

我收到此错误:

WITH...AS 语法错误

当我尝试执行以下查询时出现:

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)

任何指导我错误所在的帮助将不胜感激!

postgresql cte except

2
推荐指数
1
解决办法
632
查看次数

如何定义一个只接受三个字符的函数?

我试过这个:

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 plpgsql functions

2
推荐指数
1
解决办法
203
查看次数