2011-09-16 22 views
1

我有一張表,我需要按類別進行約束,然後在某個日期範圍內查找所有重疊日期。這大約需要2秒,這對於大約每秒50次的每次交易都是不可接受的。另一種方法是創建一些統計表 - 然後再次,我不知道這是一個偉大的想法,因爲事情可能會失去同步。Oracle事務處理 - 計數表

Date on Rent # Rented Category 
9/5/2011  5   CATEGORY1 

在Oracle(PL/SQL,如果它事項),我怎麼能保持這樣的表現,但要確保併發事務不通過使比它少了一個或一個以上搞砸了遞增/遞減真的是?

我有兩種類型的交易,有點像搜索和租金。只有租金會更新這個計數表(並且只是從中讀取數據)。我不介意租金是否放緩,但不希望搜索性能受到影響。租金的發生頻率可以達到每秒5-10次。

+0

你的問題有點困惑:你真的想要什麼?你真的用盡了改進原始查詢的策略嗎?你試過什麼了?數據庫的什麼版本?哪個版本?數據如下:表格中的總行數,類別數量,日期範圍的寬度? – APC

+0

日期範圍可以長達6個月。大多數日期可能是5天,因爲有延遲收費。我使用10gR2。總行數約爲1200萬。當我刪除一些約束(其中我知道會導致問題並可以解決)時,我可以將查詢降低到1.7秒,但這仍然太慢。我需要它是0.02秒。查找重疊日期的約束類似於AND AND_date('07/05/2011 00:00:00','MM/DD/YYYY HH24:MI:SS')<= return_date AND to_date('07/18/2011 23:59:59','MM/DD/YYYY HH24:MI:SS')> = start_date'。 –

+0

請注意,大多數這些行是歷史的,只需要查看當前和未來的行。 –

回答

1

Oracle使用鎖確保查詢期間的數據一致性。他們如何工作的細節可能會變得複雜,但效果是它保證了對你的計數表的更新/插入將只使用主表中的數據和查詢開始時的數據。如果在進行更新/插入計數表時有另一次更新或插入到主表,它不會影響它。

你必須試驗你的數據,看看是否保留一個總結/統計表幫助或傷害你。這實際上取決於主表的更新速度有多快,您更新計數表的時間多少,以及可以選擇多少時間以及您需要選擇的最新時間。

+0

Oracle不使用鎖來保證讀一致性:它使用來自UNDO表空間的數據來呈現一致的結果集。 http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/consist.htm#i5702 – APC