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

时间:2017-07-05 08:36:42

标签: sql postgresql jdbc

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

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

我们已经使用PreparedStatement#setFetchSize()滚动结果集并逐步处理大型结果集。 但是,当结果集太大时,我们希望避免在客户端和数据库端通过网络或任何其他不必要的工作进行连接。

预先执行SELECT COUNT(*)...会降低查询在一般情况下表现良好的预期情况的性能。

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

1 个答案:

答案 0 :(得分:3)

看看here

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

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;

它使用PGSQL的EXPLAIN命令来估计返回的rowcount。