2016-03-24 51 views
0

我需要在列上創建索引以獲得更好的性能。該列是類型時間戳,並且是基於函數的索引。 問題是:此列更新頻繁。非常頻繁地更新列的索引

據說Oracle文檔不會索引經常修改的列。

那麼有沒有更好的方式來查詢這一列?

編輯

在下面的查詢,該列VALIDATIONTIME:

select * 
from orders 
where VALIDATIONTIME between 
    TO_TIMESTAMP('2016/03/06 10:45:18', 'YYYY/MM/DD HH24:MI:SS') 
and 
    TO_TIMESTAMP('2016/03/15 19:50:18', 'YYYY/MM/DD HH24:MI:SS'); 
+4

只有索引能夠幫助處理性能問題時才應該構建索引。訣竅是找到流程中的瓶頸。如果您的更新時間過長 - 請不要創建索引,如果您的選擇是您的問題 - 請創建索引。沒有單一的規則可以遵循,而Oracle的文檔只是推薦在這些情況下最好的做法。 –

+1

正如上面提到的人,它只是一個權衡。針對您的應用程序進行測試,並根據最終目標的結果權衡結果。 – Dane

回答

0

時間戳可以幫助確保高基數所以它很可能是一個不錯的選擇,但它實際上取決於您用來訪問數據的謂詞。 如果將行單獨插入到不同的工作單元中,則時間戳列只有良好的基數! 現在我對這張表或其使用模式一無所知,但它確實取決於您用來訪問數據的謂詞。

我們很少提出有關精確微秒發生的事情的問題。所以很難看到表格where timestamp_column = some precise value的謂詞。你更有可能看到一個範圍表達式,例如where timestamp_column between :ts1 and :ts2,而且這個謂詞通常會有一個伴侶。

因此,作爲一個總的概括,你可以考慮:

  • 將時間戳列定義表的一個綜合指數
  • 的第二或後續列範圍分區邊界上一天的,一週或月份的開始和結束時間戳,如果基數和分佈證明它是正確的;或
  • 甚至完全從索引鍵中刪除時間戳並將其與唯一索引一起存儲。

全部取決於查詢特徵。