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

Posted

技术标签:

【中文标题】如果使用 Jdbc 在 PostgreSQL 中有太多行,如何停止大型查询?【英文标题】:How to stop a large query if it has too many rows in PostgreSQL using Jdbc? 【发布时间】:2017-07-05 08:36:42 【问题描述】:

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

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

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

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

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

【问题讨论】:

您可以在不提前分析的情况下运行解释来检查估计的行数和成本 如果您只是使用PreparedStatement.setMaxRows() 限制最大大小怎么办? @vao 谢谢,在 thwiegan 的回答中讨论这个问题。 【参考方案1】:

看看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 命令来估计返回的行数。

【讨论】:

不错,但不保证估计值会小于实际结果。估计值可能大于允许的最大结果,但实际结果可能要小得多,查询应该运行。投票赞成,它最终可能适用于其他情况。 @Sagi 您可以使用它,并且在估计可能证明不够准确的极端情况下使用 select count(*) 听起来很合理。我将检查计数是否更大或更小但接近允许的最大值。在大多数情况下,这应该会有所帮助。谢谢。

以上是关于如果使用 Jdbc 在 PostgreSQL 中有太多行,如何停止大型查询?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 插入 PostgreSQL 时间类型时出错

连接到 postgresql:dbserver db 通过 JDBC 连接到 Databricks 时连接被拒绝

通过 JDBC 将数组从 spark 数据帧输入到 postgreSQL

PostgreSQL & JDBC“查询返回了多个结果集”

PostgreSQL JDBC - 使用 PreparedStatements 创建表时已存在关系

OFFSET N FETCH FIRST M ROWS 与 JDBC 和 PostgreSQL 不工作