函数花费的时间明显长于指定的超时时间

问题描述 投票: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个回答
1
投票

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.