Table1
Id
Table2Id
...
Table2
Id
StartTime
Duration //in hours
查詢
select * from Table1 join Table2 on Table2Id = Table2.Id
where starttime < :starttime and starttime + Duration/24 > :endtime
此查詢目前正在約2秒運行是太長。在Start_time + duration/24上有一個id列的索引和一個函數索引。在Sql Developer中,查詢計劃顯示沒有使用索引。查詢返回475行,用於測試開始和結束時間。表2有〜800k行表1有〜200k行
如果從查詢中刪除持續時間/ 24計算,替換爲靜態值,則查詢時間減半。這不會檢索到完全相同的數據,但會讓我相信該部門很昂貴。
我還測試了向Table2中添加endtime列,該列填充了(starttime + duration/24)該列是通過單個更新預填充的,如果它將在生產中使用,我將通過更新觸發器填充它。
select * from Table1 join Table2 on Table2Id = Table2.Id
where starttime < :starttime and endtime > :endtime
該查詢將在大約600ms內運行,並且它使用聯接索引。由於具有冗餘數據的附加列,它不那麼理想。
有沒有使這個查詢更快的方法?
根據顯示的查詢,您將檢索Table2中不在給定範圍內的所有記錄。奇怪,但沒問題。你的統計數據是否是最新的?也許優化器有錯誤的信息,並正在選擇一個不好的計劃?你想解決什麼問題?你需要Table2中的數據,還是你需要Table1中的所有東西?對數據分佈有何評論? Oracle版本(可能有一個功能可以/不能用於幫助)? – 2009-06-02 16:58:05
Oracle 10g統計信息是最新的。我的聯接倒退了,真正的表格翻譯不好。 – 2009-06-02 18:05:55
您是否至少運行過SQL * Plus AUTOTRACE或EXPLAIN PLAN(更好的是,跟蹤事件10046)。要調優查詢,首先需要_important_首先知道Oracle正在花費多少時間進行操作。 – spencer7593 2009-06-02 20:38:13