gpt4 book ai didi

sql - 在限定时间内获得 COUNT() 结果

转载 作者:行者123 更新时间:2023-11-29 13:52:50 25 4
gpt4 key购买 nike

在 PostgreSQL 中有没有办法中止 COUNT(*) 语句的执行并返回其当前结果?

我想运行:

SELECT COUNT(*) FROM table WHERE something=x;

有些查询几乎可以立即完成,但有些查询会花费相当多的时间。我想要:

  • 如果语句在限定时间内完成则返回final结果,
  • 否则它会中止执行但返回当前结果。

最好也获得退出状态(无论是完成执行还是中止)。

我找到了 statement_timeout 设置,但它没有返回任何结果,只是中止。

最佳答案

您可以轻松地指示 Postgres 计数到给定的 LIMIT - 最大行数,而不是耗时:

SELECT count(*)
FROM (
SELECT 1 FROM tbl
WHERE something = 'x'
LIMIT 100000 -- stop counting at 100k
) sub;

如果 count() 花费了很长时间,那么您要么有巨大 表,要么是您的设置存在一些其他问题。无论哪种方式,估计计数都足以满足您的目的:

在最大流逝时间后停止计数本身是不可能的。您可以使用上述技术对计数进行分区,并在每一步后检查耗时。但这增加了很多开销。使用 OFFSET 跳过行并不比计算它们便宜多少。我不认为我会使用它。正如概念证明:

DO
$do$
DECLARE
_partition bigint := 100000; -- size of count partition
_timeout timestamptz := clock_timestamp() + interval '1s'; -- max time allowed
_round int := 0;
_round_ct bigint;
BEGIN

LOOP
SELECT count(*)
FROM (
SELECT 1 FROM tbl
WHERE something = 'x'
LIMIT _partition
OFFSET _partition * _round
) sub
INTO _round_ct;

IF _round_ct < _partition THEN
RAISE NOTICE 'count: %; status: complete', _partition * _round + _round_ct;
RETURN;
ELSIF clock_timestamp() > _timeout THEN
RAISE NOTICE 'count: %; status: timeout', _partition * _round + _round_ct;
RETURN;
END IF;

_round := _round + 1;
END LOOP;

END
$do$;

您可以将其包装在 plpgsql 函数中并传递参数。甚至使用 EXECUTE ...

使其适用于 任何给定的表/列

如果您的 ID 列几乎没有间隙,则该技术会更有意义。您可以按 ID 进行分区,而且开销要少得多......

关于sql - 在限定时间内获得 COUNT() 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37711550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com