1

此请求使用 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) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:308) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)

4

2 回答 2

1

我会删除 distinct 和 left join。

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 的 id?如果您会使用表 a 的 id,那么这是否有意义。从表 a 的角度来看,左连接将返回表 a 中的所有 id,即使表 b 中没有匹配项也是如此。这不是您想要的,因为它可能是大量数据。您需要表 a 和表 b 的子集。因此,您不应该在不使用它的情况下询问(左连接)中的所有数据。Distinct 也会产生性能问题。只有当它具有附加值时才使用它。我在这里看不到附加值。

于 2013-05-21T13:23:43.320 回答
0

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

于 2013-05-10T22:34:22.093 回答