隨著時間推移,資料庫中資料量會越來越大,如果把查詢分析都掛到資料庫上,有可能會影響到生產系統的正常執行。所以,一般都會將生產資料庫中不再變動的資料定期移出到另乙個分析資料庫中,由分析資料庫來承擔查詢分析的壓力。
不過,我們知道,檔案系統比資料庫有更好的io效能,對於不再變動的歷史資料,使用檔案還可以採用更靈活的壓縮技術。這樣,如果我們把移出的資料儲存到檔案中,只要有好的計算引擎(比如集算器),那麼基於檔案計算將獲得比分析資料庫更好的效能,而歷史資料常常巨大,效能提公升很有意義。
要實現這種結構,需要定期把歷史資料從生產資料庫中匯出到檔案,這看起來也沒什麼難的,匯出是很常規的資料庫操作。
如果是冷匯出,那確實沒什麼。所謂冷匯出,是指在資料匯出過程中,基於檔案的查詢分析系統會暫停使用,等匯出完畢後再繼續使用。比如在每天夜間沒有查詢工作的時候進行,把匯出的新歷史資料追加到原來的檔案之後就可以了,有需要建索引的情況也可以同時維護好。
但是如果是熱匯出,情況就不一樣了。所謂熱匯出,是指查詢分析系統永不停機,隨時需要能響應請求。而資料匯出本身也需要時間,在匯出的過程之中仍然可能有查詢請求進來。但是,這種有特殊格式的檔案在追加和維護(索引)過程中,經常是不可用的,這時候就不能在匯出資料的同時還響應查詢請求了。
採用資料庫卻沒有這個問題。原因是資料庫擁有事務一致性的能力,在資料寫入(匯出對於目標資料庫來講是寫入)過程中,資料庫仍然可以應對查詢請求,並且不會使尚未完全寫入的資料參與查詢。不過,如果每批資料量寫入太多時,也會給目標資料庫造成較大的負擔,資料庫回滾機制的成本並不低。
那麼,我們怎麼能夠即享受到檔案的高效能,又支援不停機的熱匯出呢?
乙個簡單的辦法是把資料檔案拆細。比如,假如資料是每天匯出,那麼就可以每天儲存乙個檔案,每次匯出時形成新檔案,在匯出過程中原有的檔案不變,可以繼續使用。新的一天的檔案匯出維護完成後,在某個時刻才開始啟用。比如每天0點開始匯出前一天資料,假定一小時內能全部完成,則可以約定凌晨1點起啟用新檔案資料(即1點以後的查詢將開始使用這個新檔案)。這樣的壞處是檔案系統中積累過多碎檔案,對管理造成麻煩,而且每次查詢時都可能要涉及多個檔案,運算**不好寫而且效能也會受到影響。
在資料庫一致性能力的支援下,再配合備份檔案,我們還是可以實現將資料熱匯出成單一檔案。
基本原理是在匯出資料過程中使用另乙個檔案,完成匯出後再換回來去維護備份檔案。期間要考慮到查詢的併發性,借助資料庫的一致性確保不會發生寫入和查詢在同乙個時刻針對同一檔案進行。併發讀寫導致的錯誤,不是刻意或大規模使用時很難測試出來,在設計時要特別小心。
許多機構期望資料庫系統能支援t+0全量實時查詢,在資料量很大時一般只能進行資料庫擴容了(包括上述分庫手段也需要擴容資料倉儲),成本高昂。如果採用檔案系統和生產資料庫混合運算,就可以實現低成本高效能的t+0查詢了,而熱匯出機制則是這個方案的基礎(需要進行簡單改造,在x表中記錄檔案中資料的截止時刻,超過此時刻的查詢請求將轉給生產資料庫去執行)。
不過,這個過程確實有些複雜,實現起來還是很麻煩,我們在幹學院上放乙個以t+0查詢為目標而實現的熱匯出例程(另外,在新的集算器倉庫版也將支援這一機制,直接向組表追加資料就可以了,集算器會自動處理熱匯出中的問題。當然,集算器不能依賴有資料庫,它會自己實現一致性效果。
原文發布時間為:2018-11-6
如何將Excel資料匯出到Oracle資料庫
以下的文章主要是介紹如何用sql loader將excel相關的資料匯出到oracle資料庫,其主要的目的是實現往oracle資料庫裡插入excel相關檔案中的實際應用資料,以下就是文章的具體內容的介紹。實現步驟 1 開啟microsoft excel 2000 2 檔案 f 新建 n 工作簿 3 ...
SQL server 將資料匯出到檔案方法
這裡使用xp cmdshell命令。mark一下。注 如果操作sql server的使用者沒有sp configure的使用許可權,需要將對應使用者新增 sysadmin 角色。1 首先啟動該命令,方法如下 sp configure show advanced options 1 reconfigu...
Qt 將資料匯出到csv檔案
include include include在上兩篇的基礎上,在void mainwindow on pushbutton 4 clicked 中增加相應 顯示所選表所有內容 void mainwindow on pushbutton 4 clicked file.setfilename file...