小编pie*_*rop的帖子

如何从 PostgreSQL 事务内部记录自定义消息?

我有一个生成交易并执行它们的软件。我想根据执行的查询占查询总数的简单比例异步检查事务进度。我能够读取stdoutstderr生成的psql,所以我想一个解决方案可以打印到stdout一些自定义消息,如“进度:3/8”(或另一个自定义文本字符串)。

我曾考虑过执行“日志查询”,该查询将有关查询进度的信息存储在适当的表中,但该表在事务完成之前不可用,这使我无法检查事务进度。

目前我尝试了以下操作(假设在交易中有 3 个查询来做一些事情):

BEGIN;
CREATE OR REPLACE FUNCTION progress(curr int, total int) RETURNS float AS $$
BEGIN
  RAISE NOTICE '___PROGRESS___%', curr/total::float;
  RETURN curr/total::float;
END;

-- First query
SELECT ... FROM ...;
-- Log the progress
SELECT * FROM progress(1,3);

-- Second query
SELECT ... FROM ...;
-- Log progress
SELECT * FROM progress(2,3);

-- Third query
SELECT ... FROM ...;
-- Log progress
SELECT * FROM progress(3,3);

COMMIT;
Run Code Online (Sandbox Code Playgroud)

我使用以下语法从 bash …

postgresql log

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

PostgreSQL 在同一列上存在两种不同类型的索引时的行为

如果我在同一列上创建两个(或多个)不同类型的索引,PostgreSQL 的行为如何?

就我而言,我想将 B 树索引与tsvector列上的 GIN 进行比较。我知道 GIN 专门用于tsvector. 奇怪的是,如果我创建 B 树索引,PostgreSQL 不会抱怨,但我看到查询计划器不使用它。我还可以创建 GIN 索引(不删除 B 树索引),现在规划器使用新创建的索引。该列现在有两个索引,但只使用了其中一个。

即使存在两个以上的索引,用于选择索引类型的标准是什么?为什么 PostgreSQL 不告诉我 a 上的 B 树索引tsvector是无用的,并且不会永远不会被计划者使用?

更新
GIN 索引仅用于某些检查条件,例如my_tsvector IS NOT NULL但(显然)不适用于my_tsvector @@ '...'::tsquery.

postgresql index execution-plan operator

4
推荐指数
1
解决办法
716
查看次数

标签 统计

postgresql ×2

execution-plan ×1

index ×1

log ×1

operator ×1