ClickHouse為何如此之快

針對ClickHose為什么很快的問題,基于對ClickHouse的基礎概念之上,一般會回答是因為是列式存儲數據庫,同時也會說是使用了向量化引擎,所以快。上面兩方面的解釋也都能夠站得住腳,但是依然不能夠解釋真正核心的原因。因為這些技術并不是秘密,市面上很多數據庫同樣使用了這些技術,但是依然沒有ClickHouse這么快。我們可以從兩外一個角度來探討一番ClickHouse的快的秘密。

對于一般軟件設計架構的時候,一般采用自上而下的設計模式,ClickHouse的原型系統在2008年就誕生了,在誕生之初它并沒有宏偉的規劃。相反它的目的很簡單,就是希望能以最快的速度進行GROUP BY查詢和過濾,它是采用自下而上的設計方式。那么ClickHouse是如何實現自下而上的設計的呢?

1、著眼硬件,先想后做

首先從硬件功能層面著手設計,在設計之初就至少需要詳情粗如下幾個問題。

  • 我們將要使用的硬件水平是怎樣的?包括CPU、內存、硬件、網絡等。
  • 在這樣的硬件上,我們需要達到怎樣的性能?包括延遲、吞吐量等。
  • 我們準備使用怎樣的數據結構?包括String 、HashTable、Vector等。
  • 選擇的這些數據肌結構,在我們的硬件上會如何工作?

如果能想清楚上面這些問題,那么在動手實現功能之前,就已經能夠計算出粗略的性能了。所以,基于將硬件功效最大化的目的,ClickHouse會在內存中進行GROUP BY,并且使用HashTable裝載數據。與此同時,他們非常在意CPU L3級別的緩存,因為一次L3 的緩存失效會帶來70~100ns的延遲。這意味著單核CPU上,它會浪費4000萬次/秒的運算;而在一個32線程的CPU上,則可能會浪費5億次/秒的運算。所以別小看這些細節,一點一滴的將它們累加起來,數據是非常可觀的。正因為注意了這些細節,所以ClickHouse在基準查詢中能做到1.75億次/秒的數據掃描性能。

2、算法在前,抽象在后

俗話說”選擇比努力更重要。“確實,好多時候,路線選錯了再努力也是白搭。在ClickHouse的底層實現中,經常會面對一些重復的場景,例如字符串字串查詢、數組排序等。如何才能實現性能的最大化呢?算法的選擇是重中之重。clickHouse并沒有選擇字符串搜索算法書籍《Handbook of Exact String Matching Algorithms》中的35種常見的字符串搜索算法,因為這些性能不夠快。在字符串搜索方面,針對不同的場景,ClickHouse最終選擇了這些算法:對于常量,使用Volnisky算法;對于非常量,使用CPU的向量化執行SIMD,暴力優化;正則匹配使用了re2和hyperscan算法。性能是算法選擇的首要考量指標。

3 、勇于嘗鮮,不行就換

除了字符串之外,其余的場景也與它類似,ClickHouse會使用最合適、最快的算法。如果效果不錯,就保留使用;如果性能不盡人意,就將其拋棄。

4、特定場景,特殊優化

針對同一個場景的不同狀況,選擇使用不同的實現方式,盡可能將性能最大化。關于這一點,其實在前面介紹字符串查詢時,針對不同場景選擇不同算法的思路就有體現了。類似的例子還有很多,例如去重計數uniqCombined 函數,會根據數據量的不同選擇不同的算法:當數據量較小的時候,會選擇Array保存;當數據量中等的時候,會選擇HashSet;而當數據量很大的時候,則使用HyperLogLog算法。

對于數據結構比較清晰的場景,會通過代碼生成技術實現循環展開,以減少循環次數。接著就是大家熟知的大殺器—向量化執行了。SIMD被廣泛地應用于文本轉換、數據過濾、數據解壓和JSON轉換等場景。相較于單純地使用CPU,利用寄存器暴力優化也算是一種降維打擊了。

5、 持續測試,持續改進

如果只是單純地在上述細節上下功夫,還不足以構建出如此強大的ClickHouse,還需要擁有一個能夠持續驗證、持續改進的機制。由于Yandex的天然優勢,ClickHouse經常會使用真實的數據進行測試,這一點很好地保證了測試場景的真實性。與此同時,ClickHouse也是我見過的發版速度最快的開源軟件了,差不多每個月都能發布一個版本。沒有一個可靠的持續集成環境,這一點是做不到的。正因為擁有這樣的發版頻率,ClickHouse才能夠快速迭代、快速改進。

所以ClickHouse的黑魔法并不是一項單一的技術,而是一種自底向上的、追求極致性能的設計思路。這就是它如此之快的秘訣。

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

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

相關文章

AI:101-基于深度學習的航空影像中建筑物識別

?? 本文選自專欄:人工智能領域200例教程專欄 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶有在本地跑過的核心代碼,詳細講解供大家學習,希望可以幫到大家。歡迎訂閱支持,正在不斷更新…

2023_刷題_二叉樹

文章目錄 書leixingleixing 書 leixing leixing

基于以太坊的智能合約開發Solidity(基礎篇)

參考教程:基于以太坊的智能合約開發教程【Solidity】_嗶哩嗶哩_bilibili 1、第一個程序——Helloworld: //聲明版本號(程序中的版本號要和編譯器版本號一致) pragma solidity ^0.5.17; //合約 contract HelloWorld {//合約屬性變…

Python軸承故障診斷 (四)基于EMD-CNN的故障分類

目錄 前言 1 經驗模態分解EMD的Python示例 2 軸承故障數據的預處理 2.1 導入數據 2.2 制作數據集和對應標簽 2.3 故障數據的EMD分解可視化 2.4 故障數據的EMD分解預處理 3 基于EMD-CNN的軸承故障診斷分類 3.1 訓練數據、測試數據分組,數據分batch 3.2 定義…

D : DS查找——折半查找求平方根

Description 假定輸入y是整數&#xff0c;我們用折半查找來找這個平方根。在從0到y之間必定有一個取值是y的平方根&#xff0c;如果我們查找的數x比y的平方根小&#xff0c;則x2<y&#xff0c;如果我們查找的數x比y的平方根大&#xff0c;則x2>y&#xff0c;我們可以據此…

stu05-前端的幾種常用開發工具

前端的開發工具有很多&#xff0c;可以說有幾十種&#xff0c;包括記事本都可以作為前端的開發工具。下面推薦的是常用的幾種前端開發工具。 1.DCloud HBuilder&#xff08;輕量級&#xff09; HBuilder是DCloud&#xff08;數字天堂&#xff09;推出的一款支持HTML5的web開發…

硬件開發筆記(十四):RK3568底板電路LVDS模塊、MIPI模塊電路分析、LVDS硬件接口、MIPI硬件接口詳解

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134634186 紅胖子網絡科技博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬…

linux 關于$-的解釋(帖子搜索合集)

在學習Linux的時候&#xff0c;今天遇到了$-&#xff0c;什么意思呢&#xff1f;網上搜索了一些帖子&#xff1a; 帖子1&#xff1a; linux命令 $- 是什么意思 $- 是什么意思&#xff1f;有什么用&#xff1f;可以判斷什么交互式shell&#xff1f; $-記錄著當前設置的shell…

軟考高級備考-系統架構師(機考后新版教材的備考過程與資料分享)

軟考高級-系統架構設計師 考試復盤1.考試結果2.備考計劃3.個人心得 資料分享 考試復盤 1.考試結果 三科壓線過&#xff0c;真是太太太太太太太幸運了。上天對我如此眷顧&#xff0c;那不得不分享下我的備考過程以及一些備考資料&#xff0c;幫助更多小伙伴通過考試。 2.備考…

time模塊(python)

一.sleep休眠 [rootrhel8 day04]# vim demo01_time.py import time def banzhuan():print("搬磚")time.sleep(3.5) #讓程序休眠3.5秒print("結束")banzhuan()[rootrhel8 day04]# python3 demo01_time.py 搬磚 結束運行時&#xff0c;會發現程序中間暫停…

【3DsMax】制作簡單的骨骼動畫

效果 步驟 首先準備4個板子模型展開放置好 添加一個4段的骨骼 選中其中的一塊板子添加蒙皮命令 在蒙皮的參數面板中&#xff0c;設置每塊板子對應哪塊骨骼 設置好后你可以發現此時就已經可以通過骨骼來控制模型了 接下來就可以制作動畫 點擊左下角“時間配置”按鈕 設置一下動…

HarmonyOS--ArkTS(1)--基本語法(1)

目錄 基本語法概述 聲明式UI描述 自定義組件 創建自定義組件 自定義組件的結構--struct &#xff0c;Component&#xff0c;build()函數 生命周期 基本語法概述 裝飾器&#xff1a; 用于裝飾類、結構、方法以及變量&#xff0c;并賦予其特殊的含義。如上述示例中Entry、C…

VSCode安裝與使用

VS Code 安裝及使用 1、下載 進入VS Code官網&#xff1a;地址&#xff0c;點擊 DownLoad for Windows下載windows版本 注&#xff1a; Stable&#xff1a;穩定版Insiders&#xff1a;內測版 2、安裝 雙擊安裝包&#xff0c;選擇我同意此協議&#xff0c;再點擊下一步 選擇你…

SQL Server查詢計劃(Query Plan)——SQL處理過程

6. 查詢計劃(Query Plan) 6.1. SQL處理過程 就SQL語句的處理過程而言,各關系庫間大同小異,尤其是商業庫之間實現機制和細節差別更小些,其功能及性能支持方面也更加強大和完善。SQL Server作為商業庫中的后起之秀,作為SQL語句處理過程的主要支撐和保障,其優化器及相關機…

【Vulnhub 靶場】【hacksudo: ProximaCentauri】【簡單 - 中等】【20210608】

1、環境介紹 靶場介紹&#xff1a;https://www.vulnhub.com/entry/hacksudo-proximacentauri,709/ 靶場下載&#xff1a;https://download.vulnhub.com/hacksudo/hacksudo-ProximaCentauri.zip 靶場難度&#xff1a;簡單 - 中等 發布日期&#xff1a;2021年06月08日 文件大小&…

第9節:Vue3 指令

如何在UniApp中使用Vue3的指令&#xff1a; <template> <view> <!-- 使用指令 --> <text v-show"isVisible" click"toggleVisibility">點擊隱藏/顯示</text> <button v-on:click"incrementCount">點擊…

【LeetCode:70. 爬樓梯 | 遞歸 -> 記憶化搜索 -> DP】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

【圖片版】計算機組成原理考前復習題【第3章 存儲系統-2(Cache)】

目錄 前言 考前復習題&#xff08;必記&#xff09; 結尾 前言 在計算機組成原理的學習過程中&#xff0c;我們深入探索了計算機系統概述這一重要領域。計算機系統作為現代科技的核心&#xff0c;是整個計算機科學的基石。我們將學到的知識與理論轉化為了能夠解決現實問題…

web api性能測試使用wrk

web api性能測試 這邊簡單的給出shell腳本 注意先安裝&#xff1a;wrk和gnuplot #!/bin/bash# Copyright 2020 Lingfei Kong <colin404foxmail.com>. All rights reserved. # Use of this source code is governed by a MIT style # license that can be found in the…

vue 學習 -- day39(vue3 — reactive 對比 ref)

從定義數據角度對比&#xff1a; ref用來定義&#xff1a;基本類型數據。reactive用來定義&#xff1a;對象&#xff08;或數組&#xff09;類型數據。備注&#xff1a;ref也可以用來定義對象&#xff08;或數組&#xff09;類型數據, 它內部會自動通過reactive轉為代理對象。從…