2014-10-09 34 views
0

我有一個定義的序列,專門用於表中的列。增加1並緩存10.這是一個巨大的表格,在列上沒有索引。我想知道列的最大值。由於max函數會花費很多時間,因此我正在使用last_number列的all_sequences視圖。這是正確的方法嗎?特別是涉及緩存?因此,如果該表是僅插入且不刪除的,並且1000是插入的最大值,那麼我將看到last_number爲1000?最大函數與使用Oracle中的all_sequences相關聯

編輯: 我想在數據庫不可用於正常流量後知道這一點。當我運行這個時沒有其他連接。

+2

這通常不起作用。如果一個事務已經回滾或者如果其他會話已經插入了一行但尚未提交呢?你爲什麼想知道'max'值?你確定你不想使用序列的'currval'(它會告訴你從當前會話序列中獲得的最後一個值)。 – 2014-10-09 21:52:53

+0

你想知道該列中的最大值或表中的行數嗎? – APC 2014-10-09 23:00:53

回答

1

如果您確實需要知道列的最大值,最快的方法可能是在該列上添加索引;這樣查詢只需要從索引中獲取最後一個塊來確定最大值 - 您只需確保您的查詢編寫正確,以利用Oracle的MIN/MAX優化(例如,SELECT MAX(id) FROM mytable應該這樣做 - 但檢查執行計劃首先)

正如賈斯汀所說,序列生成器不太可能用於此目的 - 不僅僅是因爲回滾,還有其他序列特性,如緩存,增量以及它們在RAC環境中的表現如何,意味着通常預期last_number遠高於列的實際最大值。