2011-02-10 13 views
1

我目前正在做一些倉庫解決方案的數據加載。我每晚都會從生產中獲得數據導出,然後必須加載。倉庫表上沒有其他更新。只加載新項目的某個表目前我做以下步驟:最大(col)所需的索引?

  • 獲取特定列的當前最大值Y(ID爲期刊表和時間對事件表)
  • 負荷通過查詢數據,如where x > y

爲了避免出現性能問題(我加載每天大約有一百萬行),我刪除了大部分指數從表中(也有隻生產所需要的,而不是在倉庫中)。但這樣,最大值的檢索需要一些時間...所以我的問題是:

什麼是最佳的方式來獲得當前最大值列沒有索引在該列?我剛剛閱讀了關於使用stats,但我不知道如何處理帶時區和時區的列。加載之前禁用索引,然後重新創建它需要太長時間...

+3

對於近親:這是關於SO的主題。這是一個關於編程DBMS的問題。 – 2011-02-10 14:27:19

回答

3

作爲列級統計信息的一部分計算的最小值和最大值是估計值。優化器只需要它們相當接近,而不是完全準確。我當然不會相信它們是加載過程的一部分。

每天加載一百萬行並不是很多。你有一個非常小的加載窗口?我有點難以相信,你無法負擔索引你需要做最小/最大索引掃描的行的成本。

但是,如果您希望避免使用索引,則可能希望將最後一個最大值存儲在您作爲加載過程的一部分進行維護的單獨表中。在表A中加載1-1000行後,您需要更新表A的彙總表中的行,以表明您處理的最後一行是行1000.下一次,您將讀取彙總表並從1001開始。

2

如果列上沒有索引,DBMS在列中查找最大值的唯一方法是完成表掃描,這對於大型桌子來說需要很長時間。

我想DBMS可以嘗試跟蹤列中的最小值和最大值(存儲系統目錄中的值),因爲它插入,更新和刪除 - 但刪除是爲什麼我沒有知道DBMS嘗試通過每行操作保持統計數據的最新狀態。如果刪除最大值,則如果未對列進行索引,則查找新的最大值需要進行表掃描(並且如果索引爲索引,則索引使查找最大值變得微不足道,因此信息不必存儲在系統目錄)。這就是爲什麼他們被稱爲'統計';它們是適用的值的近似值。但是當你請求'SELECT MAX(somecol)FROM sometable'時,你並不是要求統計最大值;你要求實際的最大值。

+0

聽起來合理......因爲我只做插入操作而導致壞... ;-) – Ingo 2011-02-10 14:51:22

+0

因此,在加載之前禁用索引並在加載後更新它會更好嗎?如果是,如何? – Ingo 2011-02-10 14:55:30

0

創建提取文件的過程還會用所需的最小/最大值提取單個行文件。我認爲這部分是在某些cron或調度程序上編寫的,因此不應要求將最小/最大值計算添加到該腳本;)

如果不是,則只執行一次完整掃描。百萬行並不是真的,特別是在數據倉庫環境中。

0

此代碼與甲骨文寫的,但應與大多數SQL版本兼容:

這得到根據範圍表中的最大(high_val)的關鍵。

select high_val, my_key 
from (select high_val, my_key 
     from mytable 
     where something = 'avalue' 
     order by high_val desc) 
where rownum <= 1 

這是什麼說的是:排序mytable由high_val降序的值,其中東西='avalue'。只抓取最上面的一行,它將爲您提供所選範圍內的max(high_val)和該表中的my_key。