标签: postgresql

如何按行查找列中的单词数(所有单词和唯一单词)?

我的 Postgresql 数据库中有一个名为Description包含文本的列。出于某些分析目的,我想查找该描述中的单词总数(以空格分隔)(所有单词和唯一单词),并在 columnsword_count和中设置这些计数unique_word_count。例如。

ID 描述
1 美好的一天
2 这是一个产品。它是有益的

我想要有以下输出:

ID 字数 唯一字数 描述
1 4 4 美好的一天
2 7 6 这是一个产品。它是有益的

for是 6 unique_word_countid = 2因为这个词is已经重复了 2 次。

postgresql

5
推荐指数
1
解决办法
8977
查看次数

PostgreSQL 中的“块”和“页”是同一个东西吗?

我看过很多讨论 Postgres“块”的博客和视频。这些与其他数据库管理系统实现中的“页面”相同吗?

postgresql terminology

5
推荐指数
1
解决办法
1399
查看次数

PostgreSQL - 如何列出特定数据库的所有唯一索引?

我想获取 PostgreSQL 中特定数据库的所有 UNIQUE 索引(用于唯一列组合)的列表。我进行了搜索,但找不到与此相关的查询。

我找到了这两个查询。

SELECT indexname FROM pg_indexes;
SELECT * from pg_indexes where schemaname = 'public'; 
Run Code Online (Sandbox Code Playgroud)

但两者都不适合我的需要。我只需要那些标识唯一列索引的索引。谢谢。

postgresql index postgresql-11

5
推荐指数
1
解决办法
8045
查看次数

如何查询 postgresql 数据库以确定它的集群和版本(和端口)?

我可以快速查询数据库名称,SELECT current_database();但我一直在寻找查询集群名称和版本的方法,但没有成功 - 希望有人可以提出解决方案。

postgresql

5
推荐指数
1
解决办法
6414
查看次数

不同 ID 上的 PostgreSQL 序列化失败

可序列化隔离模式可用于避免更新插入相等 id 时的竞争条件。因此,create table u(uid int primary key, name text);如果我们运行两个相似的事务 T1 和 T2:

begin isolation level serializable;
select * from u where uid = 1;
Run Code Online (Sandbox Code Playgroud)

然后继续 T1 和 T2:

insert into u (uid, name) values (1, 'A');
Run Code Online (Sandbox Code Playgroud)

commit;只有第一个成功,而另一个抛出序列化失败之后。

这是该模式的一个非常巧妙的功能,可以处理复杂交易中的独特密钥违规,而不是诉诸特定的“黑客” insert ... on conflict然而,即使 uid 不同,例如uid = 2uid = 3,事务 T1 和 T2仍然无法提交。

怎么可能?据说他们创建了不同的谓词 SIReadlocks 并select使用索引扫描。窍门在哪里?

postgresql isolation-level serialization upsert

5
推荐指数
1
解决办法
970
查看次数

长时间运行的 READ 查询陷入“事务中空闲”状态

我在 Web API 中有一个 JDBC 连接池,它经常向 RDS 实例发出请求。每个请求都是针对长时间运行的 SQL 查询,其中 PG 决定不使用索引,因为要返回的数据量非常大。

我注意到其中一些长时间运行的查询只是停留在 state idle in transaction。当在表中查找pid这些进程时pg_locks,它们有 152 行。带模式AccessShareLock

该表的目的是永远不会更新——它充当时间表中的一个点。所以我认为不需要idle transactionor accesssharelock。我是否可以关闭这些功能,以便我的查询运行得更快并且不会因为AccessShareLock?

postgresql performance postgresql-performance

5
推荐指数
1
解决办法
5889
查看次数

更改 POSTGRES 列数据类型 - 我应该删除索引然后重新创建吗?

我有许多 postgres 表,其中有一列类型为 INT,我需要将其更改为 BIGINT。表的每个分区包含大约 1 亿行,我的目的是分离各个分区并更改列类型,然后重新附加。

我的问题是,需要更新的列已建立索引。删除索引、更改列类型然后重新创建索引可能会更快吗?或者我应该保留索引并只更改列类型?

请注意,列值不会改变,只会改变数据类型(不确定这是否相关!)

谢谢

postgresql performance index

5
推荐指数
1
解决办法
2750
查看次数

为什么无法转换为 PostgreSQL 索引中的时间戳?

我正在处理从外部源收到的 JSON 文档。在本文档中,有一个timestamp属性对应于timestampPostgreSQL 数据类型的文本格式。换句话说,它可以被转换为timestamp类型:(data->>'timestamp')::timestamp

我想timestamp在索引中使用该属性。我尝试了以下方法:

create table t
(
    data    jsonb
);

create index on t(((data->>'timestamp')::timestamp));
Run Code Online (Sandbox Code Playgroud)

我正进入(状态:

ERROR:  functions in index expression must be marked IMMUTABLE
Run Code Online (Sandbox Code Playgroud)

为什么是这样?我知道转换为 atimestamptz并不是不可变的,因为本地化配置设置不是静态的,但我无法将该逻辑应用于转换为timestamp.

还有办法将我的timestamp财产放入索引吗?

我正在使用几天前发布的 PostgreSQL 12。

postgresql index timestamp cast postgresql-12

5
推荐指数
1
解决办法
5484
查看次数

将数组值限制为允许的值集

我想设置一个 CHECK 约束来确保text[]列的元素仅包含某些值。

设置一个例子:

CREATE TABLE foo(
  countries text[]
);

INSERT INTO foo VALUES ('{"Morocco", "Mali", "Indonesia"}');
INSERT INTO foo VALUES ('{"Sokovia", "Mali"}');
Run Code Online (Sandbox Code Playgroud)

现在只允许“摩洛哥”、“马里”和“印度尼西亚”,因此第二行应该被约束拒绝。

我有一个“有效”的解决方案:

CHECK (array_length(
  array_remove(
    array_remove(
      array_remove(
        countries,
        'Indonesia'
      ), 'Mali'
    ), 'Morocco'
  ), 1) IS NULL)
Run Code Online (Sandbox Code Playgroud)

但这不太可读。

我也尝试过这个:

CHECK ((
  SELECT unnest(countries)
  EXCEPT
  SELECT unnest(array['Morocco', 'Mali', 'Indonesia'])
) IS NULL)
Run Code Online (Sandbox Code Playgroud)

但:

错误无法在检查约束中使用子查询

postgresql array check-constraints

5
推荐指数
1
解决办法
2390
查看次数

在 WHERE 子句中使用函数时查询速度变慢

这很快(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

5
推荐指数
1
解决办法
3352
查看次数