在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

列存儲索引的空間使用

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-06-25 17:30 ? 次閱讀

01、列存儲的特點

02、列存儲的物理實現

03、列存儲索引

04、列存儲索引的空間使用

傳統的存儲數據的方式是逐行存儲(Row Store),每一個Page存儲多行數據,而列存儲(Column Store)把數據表中的每一列單獨存儲在Page集合中,這意味著,Page集合中存儲的是某一列的數據,而不是一行的所有列的數據。

列存儲索引適合于數據倉庫中,主要執行大容量數據加載和只讀查詢,與傳統面向行的存儲方式相比,使用列存儲索引存儲可最多提高 10 倍查詢性能 ,與使用非壓縮數據大小相比,可提供多達 7 倍數據壓縮率 。列存儲索引使用用“批處理執行模式”的模式,這與行存儲使用的逐行數據讀取模式對比,性能大幅提升。

列存儲索引主要在下面三個特性上提升查詢的性能:

行存儲使用逐行處理模式,每次只處理一行數據;而列存儲索引使用批處理模式,每次處理一批數據行。

行存儲是逐行存儲(Row Store),每一個Page存儲多行數據,而列存儲(Column Store)把數據表中的每一列單獨存儲在Page集合中,這意味著,Page集合中存儲的是某一列的數據,而不是一行中所有列的數據。在讀取數據時,行存儲把一行的所有列都加載到內存,即使有些列根本不會用到;而列存儲只把需要的列加載到內存中,不需要的列不會被加載到內存中。

列存儲索引自動對數據進行壓縮處理,由于同一行的數據具有很高的相似性,壓縮率很高,數據讀取更快速。

一般情況下,數據倉庫的查詢語句只會查詢少數幾個列的數據,其他列的數據不需要加載到內存中,這就使得列存儲特別適合用于數據倉庫中。

01、列存儲的特點

為什么列存儲能夠大幅度提高數據的查詢性能呢?要回答這個問題,首先必須明白SQL Server引擎是怎樣讀取數據的。在讀取數據時,SQL Server每次都把所需數據所在的整個Page讀取到內存中,Page是數據讀取的最小單位。如果采用行存儲,每一個Page都存儲所有列的數據,每行的Size決定了單個Page能夠存儲的數據行數量。

我們可以粗略計算一下,如果一個數據行有10列,每列的平均Size是10B,一行的Size是100B,那么單個Page最多存儲80行(8060B/100B);如果采用列存儲模式,那么單個Page可以存儲806行(8060B/10B)。就單個Page存儲的數據行數量而言,列存儲是行存儲的10倍,SQL Server引擎把一個Page讀取到內存中,能夠獲取的數據行數量成10倍增加。

因此,采用列存儲模式時,每一個Page能夠存儲更多的數據行。在加載列存儲數據時,SQL Server只需要消耗少量的IO,就能把某一列的全部數據加載到緩存中。當從列很多的大表中讀取幾個列時,相比傳統的行存儲(Row Store)模式,列存儲(Column Store)能夠成千上萬倍地提高數據的讀取速度和查詢性能。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

02、列存儲的物理實現

數據表(堆,B-Tree)以行存儲模式存儲數據,而列存儲索引以列存儲模式存儲數據,行存儲和列存儲的示例圖:

234f8a5c-10ab-11ee-962d-dac502259ad0.jpg

1,列存儲的優點

對于列存儲,列C1…C6 存儲在不同的Page組中,列存儲的有點是:

列存儲是把每一列都單獨存儲在Pages集合中,對于行存儲,哪怕只從數據表中選擇(select)一列,SQL Server引擎都把整個數據行所在的Page讀取到內存中,而使用列存儲索引,僅僅需要把select子句指定的列讀取到內存,不需要的列不會被讀取;因此,如果一個查詢請求只需要從少量的幾個列中獲得數據,列存儲能夠大幅度提高查詢性能;

由于單個數據列的數據冗余度更高,因此同一列的數據更容易被壓縮存儲,單個Page存儲更多的數據;

緩存命中率提高,這是因為同一列的數據被高度壓縮,常用的Page被頻繁訪問而變得異常活躍,Buffer Manager把活躍的數據頁緩存到內存中,不常用的Page被換出(Page Out)。

更高級的查詢執行技術,列存儲模式讀取數據使用的是批處理模式(Batch Processing Mode),相對于傳統的行處理技術,查詢性能更高。

2,列存儲模式的物理實現

SQL Server引擎分三步實現列存儲:

step1,列存儲索引先把數據表的所有數據行分組,每個分組也稱作行組(Row Groups)。

step2,在每個行組中,每列的所有數據行構成一個列段(Column Segment),簡稱段。

step3,對每個段進行壓縮處理和編碼,每個段都單獨存儲在列存儲索引中。

237eb688-10ab-11ee-962d-dac502259ad0.png

3,編碼和壓縮

列存儲使用兩種編碼類型:基于字典(dictionary based)和基于值(value based),使用Vertipaq壓縮數據。

字典編碼是把唯一值編入字典,每一個唯一值都匹配一個序號,而序號用于索引字典,通過存儲序號來壓縮數據。如果數據表中存在大量的重復值,那么使用字典編碼壓縮率高。

值編碼用于整數類型,或小數類型,編碼的原理是把Value的范圍按照比例縮小或增大,并使用一個指數(exponent)來表示比例。如果整數(integer) 或小數(decimal)的值分布集中,那么使用基于值(value-based)編碼方法進行壓縮非常高效。

列存儲索引的物理存儲如下圖所示:

23a37e6e-10ab-11ee-962d-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

03、列存儲索引

SQL Server 2012開始引入列存儲模式,用戶通過創建列存儲索引(Column Store Index)來體驗列存儲模式帶來的性能提升。而列存儲模式非常適用于星型連接(Star- Join)類型的聚合查詢,所謂星型連接(Star-Join)的聚合查詢是指對一個大表(Large Table)和多個小表(Little Table)進行連接,并對Large Table 進行聚合查詢。在數據庫倉庫中,是指事實表和維度表的連接。

在大表上創建列存儲索引,SQL Server 引擎將充分使用批處理模式(Batch processing mode)來執行星型查詢,獲取更高的查詢性能。

典型的Star- Join的聚合查詢類似于下面的示例腳本:

selectlt.Grouping_Columns,
AggregationFunction(bt.Columns)
fromdbo.LittleTableltwith(nolock)
innerjoindbo.BitTablebtwith(nolock)
onlt.Int_Col1=bt.Int_col1
where....
groupbylt.Grouping_Columns

在SQL Server 2012中,只能創建非聚集的列存儲索引,由于列存儲索引的每一列都有獨立的存儲空間(Page Set),因此,列存儲索引會包含數據表的所有列,這樣,每一個數據列都會被索引到。但是,并不是每一列都能獲得的相同的性能提升,這是因為,列存儲使用的壓縮算法對于具有大量重復值的字符或數值的數據,壓縮效率更高。對于列存儲索引而言,查詢性能的提升很大程度上依賴列數據的高度壓縮,這會大幅減少存儲該列數據所占用的數據頁(Data Page),進而大幅減少把數據加載到內存所耗費的內存和時間。

CREATE[NONCLUSTERED]COLUMNSTOREINDEXindex_name
ONschema_name.table_name(column[,...n])
[WITH(DROP_EXISTING={ON|OFF}|MAXDOP=max_degree_of_parallelism)]
[ONpartition_scheme_name(column_name)|filegroup_name]

一旦表上創建了非聚集的列存儲索引,基礎表就變成只讀的(read-only),不能對基礎表做任何更新(insert,update,delete 或merge)操作,如果需要修改數據,那么,首先要禁用列存儲索引,然后更新數據,最后重建列存儲索引:

ALTERINDEXmycolumnstoreindexONmytableDISABLE;
--updatemytable--
ALTERINDEXmycolumnstoreindexonmytableREBUILD

由于創建或重建列存儲索引是IO密集型資源,十分耗費內存資源,因此必須在系統空閑的情況下,更新數據。

04、列存儲索引的空間使用

列存儲索引首先把數據分組,然后每個行組中的每個列構成一個段(Segment),每段都是單獨存儲的,列存儲索引占用的存儲空間的大小是由所有段占用的硬盤空間的加和。

系統視圖:sys.column_store_segments 提供每個段的數據信息,每個段都是每個行組中的一列的數據的集合,例如,如果一個列存儲索引分為10個行組,每個行組有15個數據列,那么,該視圖將返回150個段。

selecti.object_id
,object_name(i.object_id)asobject_name
,i.nameasindex_name
,i.type_descasindex_type
,col_name(i.object_id,ic.column_id)asindex_column_name
,sum(s.row_count)asrow_count
,sum(s.on_disk_size)/1024/1024ason_disk_size_mb
fromsys.column_store_segmentss
innerjoinsys.partitionsp
ons.partition_id=p.partition_id
innerjoinsys.indexesi
onp.object_id=i.object_id
andp.index_id=i.index_id
innerjoinsys.index_columnsic
oni.object_id=ic.object_id
andi.index_id=ic.index_id
ands.column_id=ic.index_column_id
groupbyi.object_id
,i.index_id
,i.name
,i.type_desc
,ic.column_id
orderbyi.object_id
,i.name
,index_column_name

可以看出,列存儲索引中每個段占用的硬盤空間是很少的,加載到內存所需要耗費的時間,IO次數和內存資源也是很少的,再配上性能更高的批處理模式,所以,列存儲能夠大幅度提高數據的查詢性能,特別是對星型聚合的查詢。
責任編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7030

    瀏覽量

    89035
  • 存儲
    +關注

    關注

    13

    文章

    4314

    瀏覽量

    85846
  • 內存
    +關注

    關注

    8

    文章

    3025

    瀏覽量

    74047

原文標題:為什么列存儲能夠大幅度提高數據的查詢性能?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    大數據存儲解決方案:行存儲 VS 存儲

    目前大數據存儲有兩種方案可供選擇:行存儲(Row-Based)和存儲(Column-Based)。
    發表于 09-27 10:27 ?2329次閱讀

    rtthread編譯后如何查看堆棧空間使用情況?

    rtthread編譯后如何查看堆棧空間使用情況,現在只能在編譯完成后看到總大小,有沒有辦法能看到詳細的使用情況。 由于RAM只有128K,除去內存池32k,想看看剩余的RAM在哪用了
    發表于 03-05 07:58

    ALTERA FPGA 配置芯片剩余空間使用的問題

    想把altera fpga配置芯片剩余的存儲空間作為其他數據的存儲空間用,可以嗎?如果行,該如何操作了呢?
    發表于 03-04 19:49

    6678中CACHE的空間使用問題

    請問: 1、如果將L1D CACHE設置為32KB,L1P CACHE設置為32KB,L2 CACHE設置為0KB; 在core的LL2中定義了兩個數組,out1占用32KB存儲空間,out2占用
    發表于 06-21 13:28

    請問索引數組問什么創建出來就默認索引行,禁用索引,我想索引怎么辦

    請問索引數組問什么創建出來就默認索引行,禁用索引,我想索引怎么辦
    發表于 09-05 16:29

    用的28035.對ram空間使用的大小有影響嗎?

    我在這邊想問下,我應用了很多buffer,需要緩存儲數據,這樣的結果是對程序的RAM的空間應用就大了,我用的28035.對ram空間使用的大小,對最終程序的運行有影響嗎?
    發表于 07-13 16:26

    基于軌道約束的空間目標球面網絡索引構建方法

    針對海量、高速運動的空間目標檢索查詢效率低的問題,提出一種基于軌道約束的空間目標球面網格索引構建方法。該方法利用地球慣性系下空間目標軌道相對穩定的特性,通過維護球面剖分網格內途經的
    發表于 11-30 10:52 ?0次下載
    基于軌道約束的<b class='flag-5'>空間</b>目標球面網絡<b class='flag-5'>索引</b>構建方法

    一種新的面向存儲的壓縮方法

    ,采用抽樣的方法獲得重復度較高的前綴;最后,使用字典編碼進行壓縮,提出了索引( CI)和實體(CR)作為數據壓縮結構來降低大數據存儲空間
    發表于 12-25 16:23 ?0次下載

    基于多維動態空間索引的顯式曲面拓撲重建算法

    針對STL文件格式存在網格頂點數據冗余以及缺乏面片鄰接信息等缺陷,提出一種基于多維動態空間索引的顯式曲面拓撲重建算法,在消除網格頂點數據復本的過程中逐步構建網格曲面頂點的KD樹,通過該索引提高頂點
    發表于 01-04 14:10 ?0次下載
    基于多維動態<b class='flag-5'>空間</b><b class='flag-5'>索引</b>的顯式曲面拓撲重建算法

    影響數據中心空間使用效率的六大因素

    數據中心的空間使用效率簡單地說是用于裝機的建筑面積與數據中心總建筑面積的比值,這個比值越低越好,越低意味著更多的空間用于安裝機架,一般用單機架建筑面積或單千瓦建筑面積來計算和衡量。空間使用效率有平面
    的頭像 發表于 08-13 10:23 ?3082次閱讀

    一百道關于MySQL索引解答

    是字符串,where時一定用引號括起來,否則索引失效 like通配符可能導致索引失效。 聯合索引,查詢時的條件不是聯合索引中的第一個
    的頭像 發表于 06-13 15:51 ?2102次閱讀

    基于POI分布的空間索引結構TDG

    基于POI分布的空間索引結構TDG
    發表于 06-25 15:56 ?10次下載

    為什么存儲能夠大幅度提高數據的查詢性能

    存儲索引適合于數據倉庫中,主要執行大容量數據加載和只讀查詢,與傳統面向行的存儲方式相比,使用存儲
    的頭像 發表于 07-09 16:11 ?602次閱讀
    為什么<b class='flag-5'>列</b><b class='flag-5'>存儲</b>能夠大幅度提高數據的查詢性能

    MySQL索引的常用知識點

    健值(主鍵的值) + 指針(存儲子節點的地址信息) 主鍵索引:健值(主鍵的值) + 指針(存儲子節點的地址信息) 非主鍵索引:非主鍵的值
    的頭像 發表于 09-30 16:43 ?464次閱讀

    索引的底層實現詳解

    說一說索引的底層實現? Hash索引 基于哈希表實現,只有精確匹配索引所有的查詢才有效,對于每一行數據,存儲引擎都會對所有的
    的頭像 發表于 10-09 10:26 ?752次閱讀
    <b class='flag-5'>索引</b>的底層實現詳解
    主站蜘蛛池模板: 久久综合九色综合97_ 久久久| 久久久久青草| 成在线人视频免费视频| 国产在线免| 午夜特级毛片| 天天干夜夜操| 亚洲综合国产一区二区三区| 免费二级c片观看| 亚洲国产人成在线观看| 特级片网站| 欧美色综合久久| 狠狠色噜噜狠狠狠狠狠色综合久久| www.嫩草影院| 狂野欧美性色xo影院| 天堂资源| 亚洲午夜影视| 性xxx无遮挡| 天堂中文在线资源| www.色播| 68日本xxxxxxxxx xx| 天堂资源在线种子资源| 丁香六月纪婷婷激情综合| 亚洲激情四射| 中国国产aa一级毛片| 日本www黄| 91高清在线成人免费观看| 黑色丝袜美美女被躁视频| 一级毛片一级毛片| 操的好爽视频| 777奇米影音| 十三以下岁女子毛片免费播放| 精品一精品国产一级毛片| 国产手机视频在线| 手机在线观看你懂的| 天天夜天天干| 亚欧精品一区二区三区| 玖玖激情| 欧美色淫网站免费观看| 五月婷婷开心综合| www.色五月.com| 性做久久久久|