偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

企業(yè)動態(tài)
列存是常見的數(shù)據(jù)存儲技術(shù),因而也被不少數(shù)據(jù)倉庫類產(chǎn)品采用,在業(yè)內(nèi)列存也常常就意味著高性能??墒?,列存真有這么好嗎?我們在這里來研究一下這個問題。

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

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

數(shù)據(jù)蔣堂第8期 

對內(nèi)存計算意義不大

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

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

加劇硬盤的不連續(xù)訪問程度

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

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

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

索引效率低

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

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

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

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

分段并行麻煩

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

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

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

我們在這里介紹列存的另一面,并非要否定列存在許多計算場景時的巨大優(yōu)勢 ,但完全不區(qū)分情況地全面采用列存也是不負(fù)責(zé)任的。對于數(shù)據(jù)倉庫類產(chǎn)品,正確的做法應(yīng)當(dāng)將這個自由度留給系統(tǒng)管理員,由用戶來決定是否采用列存、如何分塊、哪些數(shù)據(jù)采用列存、有些數(shù)據(jù)甚至?xí)写婧土写婀泊妫匀哂鄵Q取更高的性能。

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

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

2013-05-07 10:06:20

2020-07-13 23:22:02

物聯(lián)網(wǎng)電子技術(shù)

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云服務(wù)

2011-01-20 06:35:50

數(shù)據(jù)中心內(nèi)幕

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

開發(fā)軟件程序員

2021-03-09 10:05:06

5G運營商技術(shù)

2023-06-15 13:39:51

2017-12-11 18:11:02

點贊
收藏

51CTO技術(shù)棧公眾號