Oracle

調整查詢以獲取一天中具有特定狀態的所有記錄

  • May 17, 2017

我們目前正在使用 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 被索引,因此該表經過全表掃描。

有以下選項:

  1. 引入關於狀態的索引,這將解決處理“進行中”事務的問題,因為它們可能很低,但失敗並且成功會更高(但是關於“失敗”或“成功”的查詢將在一天內執行一次或兩次)。
  2. 引入一個複合索引(status,created_at),但據我了解,隨著時間的推移,數據會出現偏差,索引表也會迅速增長。
  3. 定期將正在進行的表中的數據移動​​到另一個歷史表中,以便與選項 a 結合使用。加上相當多的應用程序更改。

我不確定是否還有其他可用選項。

B-tree Index on Status 無濟於事——它有 3 個不同的值,並且全表掃描會快得多。在這種情況下,點陣圖索引應該會更好地工作,但TRANSACTION表名意味著很多 DML ,所以不應該使用它。

通過按狀態對事務表進行分區,然後在 created_time 上創建本地索引,可能會獲得一些改進。在某種意義上它類似於(3),但不需要更改應用程序,並且將行移動到正確的分區是由引擎本身完成的。然而,這是一個相當昂貴的選擇,應該用於非常龐大的數據庫。

在我看來,index on 在created_time大多數情況下都可以正常工作。

引用自:https://dba.stackexchange.com/questions/173826