2016-11-02 71 views
1

我有一個奇怪的問題,我無法修復。嘗試刪除oracle數據庫中超過1小時的行導致超時

我試圖刪除它們時間戳超過1小時的所有行。

SQL:

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

整個代碼工作完美在SQL Developer中,但是當我嘗試做iBatis.net同我得到超時。

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

另一個奇怪的是,這個問題是不存在的,當我焊割小於運算符爲「等於到」 如

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

超時我根只有萊比和grater-比運營商,只有在iBatis.net。有人知道爲什麼嗎?

有趣的事實。當我查詢DELETE FROM TABLE WHERE TIMESTAMP < '07-AUG-11'它的工作。此外,當我嘗試查詢DELETE FROM TABLE WHERE TIMESTAMP BETWEEN '07-AUG-11' AND SYSTIMESTAMP它也可以。這似乎是問題ony與<>結合SYSTIMESTAMP 是否有其他方式刪除行不超過一小時的行而不使用這些運算符? 感謝

回答

0

爲我自己的問題添加答案,因爲我能夠解決它,也許有人會在將來需要這個。

首先,我創建了新的選擇查詢:

<select id="DbTime" resultClass="DateTime"> 
    <![CDATA[SELECT SYSTIMESTAMP FROM DUAL]]> 
</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> 

現在是工作,但仍不很不知道爲什麼我的第一個解決方案想工作。

1

您可能需要

一)增加的CommandTimeout運行查詢您的DbCommand(不知道怎麼做,在iBatis.NET)

b)檢查,如果你有開放的交易,這是造成死鎖(刪除stmt等待行可用),請參閱View open transactions in Oracle

+0

1分鐘後超時,所以相當長。在SQL Developer中,執行此查詢的時間大約爲0.2秒。只有我現在使用這個表,所以還有其他連接。有趣的事實。當我查詢'DELETE FROM TABLE WHERE TIMESTAMP <'07 -AUG-11''它工作。此外,當我嘗試查詢'DELETE從表'時間'07' - 8月11日'和SYSTIMESTAMP'它也可以工作。這似乎是問題ony與'<' and '>' – Aht

+0

看起來像一個優化器的東西,這是有點超出我的範圍,這裏有幾個鏈接啓動https://community.oracle.com/thread/996993&http:// dba.stackexchange.com/questions/104797/is-index-performance-on-a-timestamp6-column-impacted-when-converting-it-to-an –

+0

謝謝我能夠解決我的問題,使用其他查詢 – Aht