Postgres 存储过程花费的时间明显超过指定的超时时间

问题描述 投票:0回答:1

我有一个正在从 SQL Server 迁移的存储过程。目的是执行的时间不会超过指定的超时时间,但可能会花费大约 4 倍的时间。存储过程内的计算是轻量级的,不会花费太多时间。如果重要的话,数据库是 GCP Cloud SQL Postgres。超时机制有什么问题吗?

CREATE OR REPLACE FUNCTION spleasetasks(timeout_seconds INT,
                                        poll_interval_millis INT
                                        ....)
    RETURNS TABLE
            (...)
AS
$$
DECLARE
    timeout     TIMESTAMPTZ := (CLOCK_TIMESTAMP() AT TIME ZONE 'UTC' + (timeout_seconds || ' seconds')::INTERVAL);
BEGIN

    CREATE
        TEMP TABLE result
    (
        ....
    ) ON COMMIT DROP;

    LOOP

        IF timeout_seconds != 0 AND (CLOCK_TIMESTAMP() AT TIME ZONE 'UTC' > timeout) THEN
            EXIT;
        END IF;

....

        IF
                    timeout_seconds = 0 OR
                    (CLOCK_TIMESTAMP() AT TIME ZONE 'UTC' + (poll_interval_millis || ' milliseconds')::INTERVAL) >=
                    timeout THEN
            EXIT;
        END IF;

....
        EXECUTE PG_SLEEP(CAST(poll_interval_millis AS FLOAT) / 1000);

    END LOOP;

    RETURN QUERY SELECT * FROM result r;

END;
$$
    LANGUAGE plpgsql;
postgresql google-cloud-platform stored-procedures plpgsql google-cloud-sql
1个回答
0
投票

EXECUTE PG_SLEEP(CAST(poll_interval_millis AS FLOAT) / 1000);

在 PL/pgSQL 中是废话,你应该使用

PERFORM

PERFORM PG_SLEEP(CAST(poll_interval_millis AS FLOAT) / 1000);

EXECUTE
应用于动态 SQL。

© www.soinside.com 2019 - 2024. All rights reserved.