如果使用 Jdbc 在 PostgreSQL 中有太多行,如何停止大型查询?

Sag*_*agi 3 sql postgresql jdbc

我们运行用户提交的查询,这些查询可能会返回一个很大的结果集。

为了避免内存问题,我们想检测这些情况并取消查询。然后期望用户修改查询。

我们已经使用PreparedStatement#setFetchSize()滚动结果集并以增量方式处理大型结果集。但是,当结果集太大时,我们希望尽可能避免将第一个结果通过网络或任何其他不必要的工作带到客户端和数据库端。

SELECT COUNT(*)...预先执行 a只会降低查询通常表现良好的预期情况的性能。

postgres 有没有办法告诉预期的结果集大小?

thw*_*gan 5

看看这里

他们正在使用数据库程序进行估算:

CREATE FUNCTION count_estimate(query text) RETURNS INTEGER AS
$func$
DECLARE
    rec   record;
    ROWS  INTEGER;
BEGIN
    FOR rec IN EXECUTE 'EXPLAIN ' || query LOOP
        ROWS := SUBSTRING(rec."QUERY PLAN" FROM ' rows=([[:digit:]]+)');
        EXIT WHEN ROWS IS NOT NULL;
    END LOOP;

    RETURN ROWS;
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

它使用EXPLAINPGSQL的命令来估计返回的行数。