我有一个生成交易并执行它们的软件。我想根据执行的查询占查询总数的简单比例异步检查事务进度。我能够读取stdout
和stderr
生成的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 的行为如何?
就我而言,我想将 B 树索引与tsvector
列上的 GIN 进行比较。我知道 GIN 专门用于tsvector
. 奇怪的是,如果我创建 B 树索引,PostgreSQL 不会抱怨,但我看到查询计划器不使用它。我还可以创建 GIN 索引(不删除 B 树索引),现在规划器使用新创建的索引。该列现在有两个索引,但只使用了其中一个。
即使存在两个以上的索引,用于选择索引类型的标准是什么?为什么 PostgreSQL 不告诉我 a 上的 B 树索引tsvector
是无用的,并且不会永远不会被计划者使用?
更新
GIN 索引仅用于某些检查条件,例如my_tsvector IS NOT NULL
但(显然)不适用于my_tsvector @@ '...'::tsquery
.