成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

第8期:列式存儲的另一面

企業動態
列存是常見的數據存儲技術,因而也被不少數據倉庫類產品采用,在業內列存也常常就意味著高性能。可是,列存真有這么好嗎?我們在這里來研究一下這個問題。

列存是常見的數據存儲技術,在許多場景下也確實很有效,因而也被不少數據倉庫類產品采用,在業內列存也常常就意味著高性能。

可是,列存真有這么好嗎?搜索一下,容易找到的列存缺點一般是針對數據修改的,而對于只讀的分析計算任務,卻很少能見到較詳細的討論。我們在這里來研究一下這個問題。

數據蔣堂第8期 

對內存計算意義不大

列存的原理很簡單:由于磁盤不適合跳動式讀取,采用行式存儲時在讀取數據時會掃描所有列,而一次運算可能只涉及很少的列,這樣就會多讀很多用不上的數據。采用列存則只需要讀取需要用到的列,數據訪問量大概率會大幅減少,而大數據計算中磁盤掃描時間的占比很大,減少訪問量就能節約大量時間。另外,同一列數據相同值情況較多,采用列存更容易做合并壓縮,從而進一步減少數據存儲量,提高性能。

從原理可以看出,列存能提高性能主要是因為減少了磁盤訪問量,但對于計算量減少并沒有幫助。如果數據已經被加載進內存,再采用列存就沒多大意義了。普通結構化數據運算都是以行為單位的,在內存中使用列存反而會加大構造完整記錄的復雜度,降低性能。所以,除了專業的向量式運算(數據挖掘中常用,運算本身就是以列為單位的)外,類似關系數據庫型的內存運算(包括內存數據庫)并不合適采用列式存儲。

加劇硬盤的不連續訪問程度

列式存儲時,各列是連續存儲的,這樣同時訪問多個列進行計算時,就會導致造成不連續的隨機訪問,訪問的列越多造成的不連續性就越強。而針對機械硬盤的不連續讀取會嚴重影響性能,在訪問列數較多或總列數并不多時,就可能發生還不如行存的性能好的現象,因為行存是連續訪問的,跳動的成本有可能超過。如果有并發任務(以及下面會說到的并行計算)還會嚴重加劇這一問題,當然行存并發時也會發生磁盤跳動,但程度比列存輕得多,列存時每多一個并發計算任務會多出幾個(涉及列數)對磁盤的并發訪問請求,行存則只會多一個磁盤并發請求。

一個辦法是加大讀取緩存區以減少磁盤尋道時間的占比,但這樣為每個涉及列都設置緩存區,列較多時會占用大量內存。另一個辦法是增加磁盤數量,把不同的列存儲到不同的磁盤上,不過列存一般應用場景都是總數列很多的情況,常常遠大于機器可以接受的硬盤數量,還會較大概率地造成磁盤隨機訪問沖突。

固態硬盤沒有尋道時間的問題,列式存儲更適合采用固態硬盤。

索引效率低

索引也是常用技術,用于從大數據集中按鍵值找出指定記錄。我們在以前文章中講過,索引的本質是排序,索引表中將存儲有序的鍵值及該鍵值對應的原表記錄位置。對于行式存儲來說,整條記錄的位置可以用一個數表示;但列存就不一樣了,整條記錄的每個列分別有各自的位置,原則上需要都記錄下來,這樣一來,索引表幾乎和原表一樣大,訪問成本變高很多,空間占用也太大,這和復制原表后排序區別并不大了。

每條記錄只存儲一個序號,然后用乘法計算出位置,這樣可以嗎?有些數據類型的字段值的長度本身就是不固定的(串型),而固定長度的字段值(整數、日期)也可能因為要壓縮編碼(列存中常用的技術)而變成不固定,一定要用定長方式存儲,索引倒是簡單了,訪問也很快,但會加大存儲量,遍歷時又不劃算了,而這是列存更主要的應用場景。

實際常用的手段是把數據分塊,塊內數據采用列存,索引只建立在塊上。這樣可以用索引迅速定位中所需要的數據在哪個塊中,然后只要塊內進行掃描即可。

這種索引比行存索引會多一個塊內掃描的過程,性能要低一些。如果原數據按索引鍵值有序(索引鍵常常就是原表主鍵),那可以很容易地定位出目標數據所在的少量的幾個塊(大概率只在一塊中),這時性能損失還可以容忍,可適用于按***ID值找出指定記錄的場景。但如果原數據對索引鍵無序,那這個索引幾乎沒有用處,目標數據可能落在幾乎所有的塊中,這就和全表掃描區別不大了。

分段并行麻煩

要充分利用多CPU(核),多線程并行能力是個必須考慮的問題,而要并行這就需要先把數據分段。

分段有兩個基本需求:每段數據量基本相同(每線程處理能力相當),可以較靈活的分段(事先不能預測線程數)。行式存儲時相對容易實現分段,只要每條(也可以每N條)記錄后做一個結束標記,在分段時按字節數平均分成K段,然后在每段中尋找到結束標記后作為開始點即可。但列式存儲不能采用同樣的辦法,由于前述原因,字段值是不定長的,某個列的分段點未必和另一個列的同樣的分段點同步落在同一條記錄上,這會錯位導致錯誤的數據。

列式存儲的分段一般也是采用前述的分塊方案:分段必須以塊為單位,在塊內不再分段并行。這樣就會有一個矛盾,首先,分塊數不能太少了,否則就無法做到靈活分段了(只有5個分塊時不可能做出10個分段),按現代服務器的CPU(核)數,要有上百個分塊才能比較自由地平衡分段;但是,分塊數又不能太多,列數據在物理上會被拆成多個不連續的小塊,不僅使得遍歷代碼復雜很多,而且還會多讀入少量兩塊之間的無用數據,對于機械硬盤還有尋道時間問題,分塊數越多這些問題就越嚴重。只有分塊內列數據占用空間比讀入緩沖區大很多時,無用數據讀入時間和尋道時間的占比才會比較小,這就要求每個分塊中有足夠多的記錄數,也就是說,實現列存并行,數據量要足夠大才有意義,對于機械硬盤(包括用機械硬盤構成的陣列)上一般得達到單機單表十億記錄、空間約在百G以上。規模較小的數據量就不容易獲得并行計算的性能提升,而特別適合使用列存的多維分析業務的數據量就處于這種尷尬的規模中。另外,分塊容量在數據追加前就要確定下來,隨著數據的不斷追加,相鄰分塊卻不能物理上合并,分塊數就會越來越多,這將給管理造成不少麻煩,需要可擴展的空間專門存儲分塊的索引信息。

我們在這里介紹列存的另一面,并非要否定列存在許多計算場景時的巨大優勢 ,但完全不區分情況地全面采用列存也是不負責任的。對于數據倉庫類產品,正確的做法應當將這個自由度留給系統管理員,由用戶來決定是否采用列存、如何分塊、哪些數據采用列存、有些數據甚至會行存和列存共存,以冗余換取更高的性能。

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2011-12-22 20:53:40

Android

2011-12-23 09:43:15

開源開放

2013-09-16 10:52:09

2012-12-19 09:04:29

2015-06-23 10:06:13

OpenStack開源云平臺SDS

2020-07-13 23:22:02

物聯網電子技術

2013-05-07 10:06:20

2022-12-08 13:06:30

2018-11-13 14:12:36

2015-07-02 10:20:27

Kubernetes容器虛擬化

2013-11-25 09:49:08

電商AWS云服務

2011-01-20 06:35:50

數據中心內幕

2017-10-09 11:06:43

2024-04-28 14:10:49

2011-08-01 09:19:37

紅帽

2017-02-23 09:52:06

2022-06-20 15:24:51

開發軟件程序員

2021-03-09 10:05:06

5G運營商技術

2023-06-15 13:39:51

2017-12-11 18:11:02

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久久中文字幕欢迎你 | 久久精品国产久精国产 | 综合久久av| 欧美aaaaaa| 国产一区二区精品在线观看 | 人人cao| 亚洲人成在线观看 | 久久中文字幕视频 | 亚洲视频一区 | 中文字幕在线观看精品 | 羞羞视频网 | 中文字幕一区二区视频 | 四虎永久免费地址 | 9191av| 国产福利91精品一区二区三区 | 色片在线观看 | 国产专区在线 | 又黄又色| 91在线观看免费 | 日韩精品一区二区三区中文字幕 | 亚洲 欧美 日韩 精品 | 伊人色综合久久久天天蜜桃 | www在线视频 | 在线日韩中文字幕 | 中文字幕亚洲欧美日韩在线不卡 | 欧美视频精品 | 精品网| 国产精品成人一区 | 久久蜜桃av一区二区天堂 | www.婷婷亚洲基地 | 一区二区免费在线观看 | av一二三区 | 日韩久久久久 | 亚洲精品久久久久久首妖 | 天天色影视综合 | 中文字幕日韩一区 | 国产精品久久久久久久久图文区 | 成人免费视频 | 成人三区 | 午夜影院在线观看免费 | 亚洲男人的天堂网站 |