國產數據庫-內核特性-低基數全局字典

國產數據庫-內核特性-StarRocks低基數全局字典

StarRocks2.0引入了低基數全局字典,可以通過全局字典將字符串的相關操作轉換成整型相關操作,大大提升查詢性能。

1、低基數字典

對于利用整型替代字符串進行處理,通常使用字典編碼進行優化。StarRocks也是利用這樣的技術。以過濾為例:一個city列,里面有:BJ,SH,GZ,SZ四個字符串,需要從里面過濾city=’BJ’的值,普通操作就需要city整個字段與‘BJ’比較進行匹配;使用字典編碼,將上面的4個字符串依次編碼為:1,2,3,4。那么過濾時僅需city=1進行比較。將字符串比較轉換成整數比較。大多數情況下,整數之間的比較性能會高于字符串的性能。

15ec8e478de5ec17f27e9519de413c7a.png

2、局部字典

18ea7f4bb38a801f766d9cd72b697f46.png

在存儲層進行字典編碼。存儲時并不存儲原有字符串數據,而是將字符串編碼后的值。但是額外會有個元數據,即編碼值與原有字符串之間的映射關系,即字典。寫入和讀取時能夠節省很多IO開銷。

3、全局字典

分布式執行引擎中,一個查詢可能會涉及多個機器多個任務之間數據交換。因此執行過程中需要保證字典全局性。字典數據始終貫穿 SQL 執行的整個生命周期,如果不是全局字典,那么加速只能在局部進行。例如如果兩個執行節點的字典編碼不一致,那么在網絡傳輸過程中需要同時把字典傳給對端機器,或者是需要提前把字典碼轉為字符串再通過網絡發送。如果能保證一個字典的全局性,在網絡傳輸中就可以直接使用字典碼而不再需要傳輸字典。

4bb05fcc7bbf8887d0a6409811491987.png

StarRocks中有全局字典,各個節點之間共享同一個字典,那么就不需要發送后再進行解碼并轉換字典碼了。

4、如何構建全局字典

1)建表時定義:

de6256e9de67493e18cde7d09c5abf70.png

這樣,用戶不友好,并且不易維護。除非用戶數據事先就定義好,數據值比較少,就那么幾個。

2)導入時構建

導入數據時,通過中心節點維護全局字典。每次遇到新的的字符都要通過中心節點創建一個新的字典碼。但是這么做的主要問題是中心節點很容易會成為瓶頸。另外中心節點因為需要同時處理維護并發控制。

因為維護和構建字典對于很多系統來說都是一個比較困難的事情,因此很多系統,只是在局部使用了局部字典來進行加速,并不支持字典的全局加速

3)查詢時構建

4d3845b3772b9f711614894d41534d38.png

發起一個查詢,就能拿到全量數據,然后對其進行編碼。代價比較高。

4)StarRocks的構建方式

3292f0673b5560c0d24d4e65f793b1a0.png

StarRocks 的基本存儲單元為 Segment,每個 Segment 的存儲結構上圖所示。

StarRocks 的存儲結構天然為低基數字符串做了字典編碼。對于 Segment 上的低基數字符串列會有以下特點:Footer 上會存儲有這個 Column 特有的字典信息,包括字典碼跟原始字符串之間的映射關系;Data page 上存儲的不是原始字符串,而是整數類型的字典碼(整型)。當處理低基數 String column 的時候,直接使用編碼后的字典碼,而不是直接處理原始的 String 值。當需要原始的 String 值時,使用字典碼就可以很方便地在這個列的字典信息里面拿到原始 String 值。這么做帶來的明顯好處是:減少了磁盤IO。可以提前做一些過濾操作,提升處理速度。

根據統計信息篩選出低基數的列,并對低基數列進行字典編碼。并不是對所有列進行編碼。

5、全局字典的使用

如果使用了全局字典優化,我們就不需要 SCAN NODE 節點就進行 Decoded,而是可以將原先的局部字典碼(int),直接映射到全局字典中的字典碼(int),并在之后的計算處理過程中,均使用全局字典碼進行處理。當遇到某些特殊的算子,或者是需要具體的依賴字符串內部信息的時候,再按著全局字典的信息,Decoded 出原始的 String 值,這樣可以充分利用到全局字典的加速。

比如select count(*) from lineitem group by l_shipmode;不需要原始字符串值,那么整個執行過程僅使用字典碼即可,而下面的語句select count(*), l_shipmode from lineitem group by l_shipmode;輸出時還需要原始字符串,那么就需要在最后將字典碼轉換成字符串輸出。

優化效果,號稱能夠提升3倍。

6、參考

https://www.bilibili.com/video/BV1ra411N7g8/?spm_id_from=333.337.search-card.all.click&vd_source=10ce859f3f7b1da2094a1283c19fe9b9

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35647.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人大金倉助力某大型金融機構業務系統異地容災優化升級

日前,人大金倉助力某大型金融機構應收賬款融資服務平臺異地容災項目順利上線,保證了平臺系統運行的連續性和數據安全,為充分發揮平臺的融資功能,緩解中小微企業融資難提供了強有力的保障。 “ 緩解中小微企業融資難 某大型金融機構…

【MySQL--->數據庫操作】

文章目錄 [TOC](文章目錄) 一、操作語句1.增2.刪3.改4.查5.備份 二、字符集與校驗規則 一、操作語句 1.增 語句格式:create database [if no exists]數據庫名[create_specification [,create_specification] …]; 中括號內是可選項,if no exists是指如果數據庫不存在就創建,存…

STM32 F103C8T6學習筆記7:雙機無線串口通信

今日嘗試配通倆個C8T6單片機之間的無線串口通信,文章提供原理,源碼,測試效果圖,測試工程下載: 目錄 傳輸不規范問題: 串口通信資源: 單個串口資源理解: 單片機串口資源&#xf…

Redis的單線程與多線程

Redis的核心處理邏輯一直都是單線程 有一些分支模塊是多線程(某些異步流程從4.0開始用的多線程,例如UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC等非阻塞的刪除操作。網絡I/O解包從6.0開始用的是多線程;) 為什么是單線程 多線程多好啊可以利用多核優勢 官方給的解釋 …

UI自動化環境的搭建(python+pycharm+selenium+chrome)

最近在做一些UI自動化的項目,為此從環境搭建來從0到1,希望能夠幫助到你,同時也是自我的梳理。將按照如下進行開展: 1、python的下載、安裝,python環境變量的配置。 2、pycharm開發工具的下載安裝。 3、selenium的安裝。…

Leetcode34 在排序數組中查找元素的第一個和最后一個位置

給你一個按照非遞減順序排列的整數數組 nums,和一個目標值 target。請你找出給定目標值在數組中的開始位置和結束位置。 如果數組中不存在目標值 target,返回 [-1, -1]。 你必須設計并實現時間復雜度為 O(log n) 的算法解決此問題。 代碼: c…

如何使用 Go 獲取 URL 的參數,以及使用時的問題

Go 獲取 URL 參數也很容易,但是由于 Go 有嚴格的數據類型和錯誤管理,所以在使用時會些微有些復雜。所以本文不僅會講如何獲取 URL 的參數,也會講在使用時的一些問題。 首先假設 URL 是https://www.example.com/?keywordabc&id12。 其他…

java中函數式接口、Stream流、方法引用、junit單元測試、反射、注解

函數式接口: 在java中有且僅有一個抽象方法的接口稱為函數式接口,但是可以包含其它的默認的或靜態的方法。 格式: 修飾符 interface 接口名稱 {public abstract 返回值類型 方法名稱(可選參數);// 其他非抽象方法 }函數式接口:…

服務器安全維護注意事項有哪些?

服務器的安全關系著公司整個網絡以及所有數據的安全,我們該如何做好服務器后續的安全維護呢?河南億恩科技股份有限公司,專注服務器托管23年,不僅是國內專業的互聯網基礎應用服務提供商之一,還是國家工信部認定的綜合電信服務運營…

OpenJDK Maven 編譯出錯: package jdk.nashorn.internal.runtime.logging does not exist

前言 OpenJDK 1.8.0Maven 3.8.5TencentOS Server 3.1 錯誤信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project tour-common: Compilation failure: Compilation failure: [ERROR] /opt/tour-c…

JavaScript預編譯機制

變量預編譯 任何變量,如果未經聲明就賦值,此變量是屬于 window 的屬性,而且不會做變量提升,無論在哪個作用域內賦值。比如說直接寫 console.log(a)肯定會報錯,提示找不到 a。但如果直接寫 a 100就不會報錯&#xff0…

【Linux命令行與Shell腳本編程】第十九章 正則表達式

Linux命令行與Shell腳本編程 第十九章 正則表達式 文章目錄 Linux命令行與Shell腳本編程 第十九章 正則表達式九.正則表達式9.1.正則表達式基礎9.1.1.正則表達式的類型9.2.定義BRE模式9.2.1.普通文本9.2.2.特殊字符 9.2.3.錨點字符錨定行首^錨定行尾$組合錨點 9.2.4.點號字符\.…

funbox3靶場滲透筆記

funbox3靶場滲透筆記 靶機地址 https://download.vulnhub.com/funbox/Funbox3.ova 信息收集 fscan找主機ip192.168.177.199 .\fscan64.exe -h 192.168.177.0/24___ _/ _ \ ___ ___ _ __ __ _ ___| | __/ /_\/____/ __|/ __| __/ _ |/ …

SpringBoot復習(39)Servlet容器的自動配置原理

Servlet容器自動配置類為ServletWebServerFactoryAutoConfiguration 可以看到通過Import注解導入了三個配置類: 通過這個這三個配置類可以看出,它們都使用了ConditionalOnClass注解,當類路徑存在tomcat相關的類時,會配置一個T…

【數據結構?堆】序列和的前n小元素

題目描述 問題&#xff1a;序列和的前n小元素   給出兩個長度為n的有序表A和B, 在A和B中各任取一個, 可以得到 n^2 個和. 求這些和最小的n個。 輸入輸出格式 輸入格式&#xff1a; 輸入數據共三行。   第一行&#xff0c;一個整數值n &#xff08; n < 10^4 &#xff…

Linux系列:從0到1用Docker部署springboot項目

目錄 1.前提條件 2.編寫DockerFile鏡像文件 3.打包SpringBoot項目 4.通過軟件Xftp進行傳輸&#xff08;*&#xff09; 1.點擊“文件-新建”?編輯 5.操作遠程主機 1.docker構建 2.容器運行 6.容器的關閉和刪除 1.前提條件 Linux、docker、xftp的安裝、一臺可以訪問的遠…

教雅川學纏論07-中樞實戰眾泰汽車000980

本文實戰眾泰汽車 下面是2023年11月14-2023年8月8眾泰汽車日K圖 先畫日K 接下來處理包含&#xff0c;就變成下面這個樣子 下面在套上纏論的理論&#xff0c;未來股價的走勢應該是紅色橢圓形虛線里面的樣子 好了&#xff0c;文章就到這里&#xff0c;如果眾泰最終不是這個走勢…

linux 目錄操作命令

目錄操作命令 文件列表 ls命令文件列表 ls [選項] [參數]-------------------------------l 詳細信息-L 緊接著符號性連接&#xff0c;列出它們指向的文件-a 所有文件&#xff0c;包含隱藏文件(以點號起始的文件)-A 與-a相同&#xff0c;但是不會列出來. 和 ..-c 根據創建時間排…

IDEA部署配置Maven項目教程,IDEA配置Tomcat(2019.3.3)

一、前言 當涉及到軟件開發和項目管理時&#xff0c;使用一個可靠的構建工具是非常重要的。Maven是一個廣泛使用的構建工具&#xff0c;它為Java項目提供了一種簡化的構建過程和依賴管理。 在本文中&#xff0c;我們將探討如何部署Maven并開始使用它來構建您的項目。我們將介紹…

Java基礎篇--淺拷貝和深拷貝

概念 淺拷貝&#xff08;Shallow Copy&#xff09;和深拷貝&#xff08;Deep Copy&#xff09;是在對象復制過程中常用的概念。 淺拷貝是指創建一個新對象&#xff0c;并將原始對象的非靜態字段的值拷貝到新對象中。如果字段是基本數據類型&#xff0c;直接復制其值&#xf…