尝试删除 oracle 数据库中早于 1 小时的行导致超时

Atempt delete rows in oracle database older than 1 hour causing timeouts

我遇到了无法解决的奇怪问题。

我正在尝试删除时间戳早于 1 小时的所有行。

SQL :

DELETE  FROM TABLE WHERE TIMESTAMP <= SYSTIMESTAMP - 1/24

整个代码在 SQL 开发人员中运行完美,但是当我尝试在 iBatis.net 中执行相同操作时,我遇到了超时。

  <statements>
    <delete id="DeleteRows" parameterClass="int">
      <![CDATA[
      DELETE  FROM TABLE WHERE TIMESTAMP <= SYSTIMESTAMP - #VALUE#/24
<!--THIS DON'T WORK-->
      ]]>
    </delete>
  </statements>

另一个奇怪的事情是,当我将 less-than 运算符挂到 'equal-to' 时,问题不存在 例如

  <statements>
    <delete id="DeleteRows" parameterClass="int">
      <![CDATA[
      DELETE  FROM TABLE WHERE TIMESTAMP = SYSTIMESTAMP - #VALUE#/24
<!--THIS WORK-->
      ]]>
    </delete>
  </statements>

仅在小于和大于运算符时出现超时,并且仅在 iBatis.net 中出现。有没有人知道为什么?

有趣的事实。当我查询 DELETE FROM TABLE WHERE TIMESTAMP < '07-AUG-11' 时,它起作用了。此外,当我尝试查询 DELETE FROM TABLE WHERE TIMESTAMP BETWEEN '07-AUG-11' AND SYSTIMESTAMP 时,它也有效。 <>SYSTIMESTAMP 结合似乎是个问题 有没有其他方法可以在不使用这些运算符的情况下删除超过一小时的行? 谢谢

您可能需要

a) 增加 DbCommand 运行 查询的 CommandTimeout(不确定如何在 iBatis.NET 中执行)

b) 检查是否有打开的事务导致死锁(删除 stmt 等待行可用),请参阅 View open transactions in Oracle

添加我自己的问题的答案,因为我能够解决它,也许将来会有人需要它。

首先我创建了新的 select 查询:

<select id="DbTime" resultClass="DateTime">
  <![CDATA[SELECT SYSTIMESTAMP FROM DUAL]]>
</select>

那我运行这个select

DateTime currentDate = DataSources.DB.QueryForObject<DateTime>("Map.DbTime", null);
DateTime finalDate= currentDate.AddHours(-24);

并传递 finalDate 作为参数

<delete id="DeleteRows">
  <![CDATA[
  DELETE FROM TABLE  WHERE TIMESTAMP < #value#
  ]]>
</delete>

现在它可以工作了,但仍然不知道为什么我的第一个解决方案想要工作。