Oracle
調整查詢以獲取一天中具有特定狀態的所有記錄
我們目前正在使用 Oracle 數據庫:
考慮一個
TRANSACTION
包含欄位TRAN_ID
,STATUS
,CREATED_TIME
, …的表。以下查詢在一天內執行多次。
select tran_id from TRANSACTION table where created_time <= TO_DATE(:1,'YYYY-MM-DD HH24:MI:SS') and created time > TO_DATE(:2, 'YYYY-MM-DD HH24:MI:SS') AND STATUS = :3`
可能的值為
I- InProgress
,F- Failed
,S - Successful
。目前只有 TRAN_ID 被索引,因此該表經過全表掃描。有以下選項:
- 引入關於狀態的索引,這將解決處理“進行中”事務的問題,因為它們可能很低,但失敗並且成功會更高(但是關於“失敗”或“成功”的查詢將在一天內執行一次或兩次)。
- 引入一個複合索引(status,created_at),但據我了解,隨著時間的推移,數據會出現偏差,索引表也會迅速增長。
- 定期將正在進行的表中的數據移動到另一個歷史表中,以便與選項 a 結合使用。加上相當多的應用程序更改。
我不確定是否還有其他可用選項。
B-tree Index on Status 無濟於事——它有 3 個不同的值,並且全表掃描會快得多。在這種情況下,點陣圖索引應該會更好地工作,但
TRANSACTION
表名意味著很多 DML ,所以不應該使用它。通過按狀態對事務表進行分區,然後在 created_time 上創建本地索引,可能會獲得一些改進。在某種意義上它類似於(3),但不需要更改應用程序,並且將行移動到正確的分區是由引擎本身完成的。然而,這是一個相當昂貴的選擇,應該用於非常龐大的數據庫。
在我看來,index on 在
created_time
大多數情況下都可以正常工作。