我的 Postgresql 数据库中有一个名为Description包含文本的列。出于某些分析目的,我想查找该描述中的单词总数(以空格分隔)(所有单词和唯一单词),并在 columnsword_count和中设置这些计数unique_word_count。例如。
| ID | 描述 |
|---|---|
| 1 | 美好的一天 |
| 2 | 这是一个产品。它是有益的 |
我想要有以下输出:
| ID | 字数 | 唯一字数 | 描述 |
|---|---|---|---|
| 1 | 4 | 4 | 美好的一天 |
| 2 | 7 | 6 | 这是一个产品。它是有益的 |
for是 6 unique_word_count,id = 2因为这个词is已经重复了 2 次。
我看过很多讨论 Postgres“块”的博客和视频。这些与其他数据库管理系统实现中的“页面”相同吗?
我想获取 PostgreSQL 中特定数据库的所有 UNIQUE 索引(用于唯一列组合)的列表。我进行了搜索,但找不到与此相关的查询。
我找到了这两个查询。
SELECT indexname FROM pg_indexes;
SELECT * from pg_indexes where schemaname = 'public';
Run Code Online (Sandbox Code Playgroud)
但两者都不适合我的需要。我只需要那些标识唯一列索引的索引。谢谢。
我可以快速查询数据库名称,SELECT current_database();但我一直在寻找查询集群名称和版本的方法,但没有成功 - 希望有人可以提出解决方案。
可序列化隔离模式可用于避免更新插入相等 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 = 2和uid = 3,事务 T1 和 T2仍然无法提交。
怎么可能?据说他们创建了不同的谓词 SIReadlocks 并select使用索引扫描。窍门在哪里?
我在 Web API 中有一个 JDBC 连接池,它经常向 RDS 实例发出请求。每个请求都是针对长时间运行的 SQL 查询,其中 PG 决定不使用索引,因为要返回的数据量非常大。
我注意到其中一些长时间运行的查询只是停留在 state idle in transaction。当在表中查找pid这些进程时pg_locks,它们有 152 行。带模式AccessShareLock。
该表的目的是永远不会更新——它充当时间表中的一个点。所以我认为不需要idle transactionor accesssharelock。我是否可以关闭这些功能,以便我的查询运行得更快并且不会因为AccessShareLock?
我有许多 postgres 表,其中有一列类型为 INT,我需要将其更改为 BIGINT。表的每个分区包含大约 1 亿行,我的目的是分离各个分区并更改列类型,然后重新附加。
我的问题是,需要更新的列已建立索引。删除索引、更改列类型然后重新创建索引可能会更快吗?或者我应该保留索引并只更改列类型?
请注意,列值不会改变,只会改变数据类型(不确定这是否相关!)
谢谢
我正在处理从外部源收到的 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。
我想设置一个 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)
但:
错误无法在检查约束中使用子查询
这很快(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 ×10
index ×3
performance ×3
array ×1
cast ×1
functions ×1
terminology ×1
timestamp ×1
upsert ×1