如何改进抛出“语句超时”的postgresql请求

时间:2013-05-07 13:56:42

标签: java performance postgresql timeout plpgsql

此请求使用postgresql抛出语句超时。

DELETE FROM my_table where my_table.id IN (
   SELECT DISTINCT b.id 
   FROM my_table a
   LEFT JOIN my_table b
   on b.rowA = a.rowA and b.rowB = true
   WHERE a.rowB = false
)

由于某些原因,我不能在postgresql上增加我的超时。所以,我需要改进我的要求。怎么改进呢?也许不使用IN?怎么做?

感谢您的帮助。


编辑更多信息:

我在JAVA批处理中,我的错误消息如下:

  

引起:org.postgresql.util.PSQLException:错误:取消   由于语句超时而导致的语句   org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1525)     在   org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1309)     在   org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:188)     在   org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452)     在   org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:354)     在   org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:308)     在   org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)

2 个答案:

答案 0 :(得分:1)

我会删除不同的和左边的连接。

delete from my_table where my_table.id in (select b.id from tblA a, tblB b 
where a.rowB = false and b.rowa = a.rowa and b.rowb = true);

问题的主要原因是左连接。为什么要在表a上使用左连接并将结果基于表b的ids?如果您已经使用了表a的ID,那么这是否有意义。从表a的角度来看,左连接将返回表a中的所有id,即使表b中没有匹配也是如此。这不是你想要的,因为它可能是大量的数据。您需要表a和表b的子集。因此,您不应该在不使用它的情况下询问(左连接)的所有数据。 不同也可能造成性能问题。只有在增加价值时才使用它。我在这里看不到附加价值。

答案 1 :(得分:0)

您不能在SQL上下文中使用truefalse(即布尔文字),即使是使用PL / SQL也是如此。