我有一个从 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;
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。