主頁 > 資料庫 > ClickHouse(14)ClickHouse合并樹MergeTree家族表引擎之VersionedCollapsingMergeTree詳細決議

ClickHouse(14)ClickHouse合并樹MergeTree家族表引擎之VersionedCollapsingMergeTree詳細決議

2023-06-22 08:07:07 資料庫

目錄
  • 建表語法
  • 使用場景
  • 合并演算法
  • 使用例子、
  • 資料分享
  • 參考文章

VersionedCollapsingMergeTree引擎繼承自MergeTree并將折疊行的邏輯添加到合并資料部分的演算法中,VersionedCollapsingMergeTree用于相同的目的折疊樹但使用不同的折疊演算法,允許以多個執行緒的任何順序插入資料,特別是,Version列有助于正確折疊行,即使它們以錯誤的順序插入,相比之下,CollapsingMergeTree只允許嚴格連續插入,

VersionedCollapsingMergeTree引擎的作用如下:

  • 允許快速寫入不斷變化的物件狀態,
  • 洗掉后臺中的舊物件狀態, 這顯著降低了存盤體積,

建表語法

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = VersionedCollapsingMergeTree(sign, version)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

針對于VersionedCollapsingMergeTree(sign, version)兩個特殊的引數,

sign — 指定行型別的列名:1是一個“state”行,-1是一個“cancel”行列資料型別應為Int8.
version — 指定物件狀態版本的列名,列資料型別應為UInt*.

使用場景

考慮一種情況,您需要為某個物件保存不斷變化的資料,對于一個物件有一行,并在發生更改時更新該行是合理的,但是,對于資料庫管理系統來說,更新操作非常昂貴且速度很慢,因為它需要重寫存盤中的資料,如果需要快速寫入資料,則不能接受更新,但可以按如下順序將更改寫入物件,使用 Sign 列寫入行時,如果Sign=1這意味著該行是一個物件的狀態(讓我們把它稱為“state”行),如果Sign=-1它指示具有相同屬性的物件的狀態的取消(讓我們稱之為“cancel”行), 還可以使用 Version 列,它應該用單獨的數字標識物件的每個狀態,

例如,我們要計算用戶在某個網站上訪問了多少頁面以及他們在那里的時間,在某個時間點,我們用用戶活動的狀態寫下面的行:

┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
│ 4324182021466249494 │         5 │      146 │    1 │
└─────────────────────┴───────────┴──────────┴──────┘

在稍后的某個時候,我們注冊用戶活動的變化,并用以下兩行寫入它,

┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
│ 4324182021466249494 │         5 │      146 │   -1 │
│ 4324182021466249494 │         6 │      185 │    1 │
└─────────────────────┴───────────┴──────────┴──────┘

第一行取消物件(用戶)的先前狀態,它應該復制已取消狀態的所有欄位,除了Sign,

第二行包含當前狀態,

因為我們只需要用戶活動的最后一個狀態,所以需要洗掉,折疊物件的無效(舊)狀態,VersionedCollapsingMergeTree會在在合并資料部分時執行此操作,

最終折疊之后的結果如下,

┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐
│ 4324182021466249494 │         5 │      146 │    1 │       1 |
│ 4324182021466249494 │         5 │      146 │   -1 │       1 |
└─────────────────────┴───────────┴──────────┴──────┴─────────┘

對于使用VersionedCollapsingMergeTree有下面三個需要注意的點,

  1. 寫入資料的程式應該記住物件的狀態以取消它,該“cancel”字串應該是“state”與相反的字串Sign,這增加了存盤的初始大小,但允許快速寫入資料,
  2. 列中長時間增長的陣列由于寫入負載而降低了引擎的效率,資料越簡單,效率就越高,
  3. SELECT結果很大程度上取決于物件變化歷史的一致性,準備插入資料時要準確,不一致的資料將導致不可預測的結果,例如會話深度等非負指標的負值,

合并演算法

合并演算法主要是下面兩個,

  • 當ClickHouse合并資料部分時,它會洗掉具有相同主鍵和版本但Sign值不同的一對行.行的順序并不重要,
  • 當ClickHouse插入資料時,它會按主鍵對行進行排序,如果Version列不在主鍵中,ClickHouse將其隱式添加到主鍵作為最后一個欄位并使用它進行排序,

ClickHouse不保證具有相同主鍵的所有行都將位于相同的結果資料部分中,甚至位于相同的物理服務器上,對于寫入資料和隨后合并資料部分都是如此,此外,ClickHouse流程SELECT具有多個執行緒的查詢,并且無法預測結果中的行順序,這意味著,如果有必要從VersionedCollapsingMergeTree表中得到完全“collapsed”的資料,聚合是必需的,

也就是說ClickHouse并不保證查詢出來的資料一定是經過合并折疊的,如果要保證一定經過折疊合并,需要查詢的時候使用GROUP BY和聚合函式,

要計算數量,使用sum(Sign)而不是count(),要計算的東西的總和,使用sum(Sign * x)而不是sum(x),并添加HAVING sum(Sign) > 0,可以在一定程度上避免資料未折疊導致的資料問題,

如果您需要手動折疊合并,但是,如果沒有聚合(例如,要檢查是否存在其最新值與某些條件匹配的行),則可以使用FINAL修飾FROM條件這種方法效率低下,不應與大型表一起使用,

使用例子、

示例資料:

┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐
│ 4324182021466249494 │         5 │      146 │    1 │       1 |
│ 4324182021466249494 │         5 │      146 │   -1 │       1 |
│ 4324182021466249494 │         6 │      185 │    1 │       2 |
└─────────────────────┴───────────┴──────────┴──────┴─────────┘

創建表:

CREATE TABLE UAct
(
    UserID UInt64,
    PageViews UInt8,
    Duration UInt8,
    Sign Int8,
    Version UInt8
)
ENGINE = VersionedCollapsingMergeTree(Sign, Version)
ORDER BY UserID

插入資料:


INSERT INTO UAct VALUES (4324182021466249494, 5, 146, 1, 1)

INSERT INTO UAct VALUES (4324182021466249494, 5, 146, -1, 1),(4324182021466249494, 6, 185, 1, 2)

我們用兩個INSERT查詢以創建兩個不同的資料部分,
如果我們使用單個查詢插入資料,ClickHouse將創建一個資料部分,并且永遠不會執行任何合并,

獲取資料:

SELECT * FROM UAct

┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐
│ 4324182021466249494 │         5 │      146 │    1 │       1 │
└─────────────────────┴───────────┴──────────┴──────┴─────────┘
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐
│ 4324182021466249494 │         5 │      146 │   -1 │       1 │
│ 4324182021466249494 │         6 │      185 │    1 │       2 │
└─────────────────────┴───────────┴──────────┴──────┴─────────┘

我們在這里看到了什么,折疊的合并部分在哪里?我們使用兩個創建了兩個資料部分INSERT查詢,該SELECT查詢是在兩個執行緒中執行的,結果是行的隨機順序,由于資料部分尚未合并,因此未發生折疊合并, ClickHouse在我們無法預測的未知時間點合并資料部分,

這就是為什么我們需要聚合:

SELECT
    UserID,
    sum(PageViews * Sign) AS PageViews,
    sum(Duration * Sign) AS Duration,
    Version
FROM UAct
GROUP BY UserID, Version
HAVING sum(Sign) > 0

┌──────────────UserID─┬─PageViews─┬─Duration─┬─Version─┐
│ 4324182021466249494 │         6 │      185 │       2 │
└─────────────────────┴───────────┴──────────┴─────────┘

如果我們不需要聚合,并希望強制折疊,我們可以使用 FINAL 修飾符 FROM 條款

SELECT * FROM UAct FINAL

┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐
│ 4324182021466249494 │         6 │      185 │    1 │       2 │
└─────────────────────┴───────────┴──────────┴──────┴─────────┘

資料分享

ClickHouse經典中文檔案分享

參考文章

  • ClickHouse(01)什么是ClickHouse,ClickHouse適用于什么場景
  • ClickHouse(02)ClickHouse架構設計介紹概述與ClickHouse資料分片設計
  • ClickHouse(03)ClickHouse怎么安裝和部署
  • ClickHouse(04)如何搭建ClickHouse集群
  • ClickHouse(05)ClickHouse資料型別詳解
  • ClickHouse(06)ClickHouse建表陳述句DDL詳細決議
  • ClickHouse(07)ClickHouse資料庫引擎決議
  • ClickHouse(08)ClickHouse表引擎概況
  • ClickHouse(09)ClickHouse合并樹MergeTree家族表引擎之MergeTree詳細決議
  • ClickHouse(10)ClickHouse合并樹MergeTree家族表引擎之ReplacingMergeTree詳細決議
  • ClickHouse(11)ClickHouse合并樹MergeTree家族表引擎之SummingMergeTree詳細決議

本文來自博客園,作者:張飛的豬,轉載請注明原文鏈接:https://www.cnblogs.com/the-pig-of-zf/p/17495702.html

公眾號:張飛的豬大資料分享,不定期分享大資料學習的總結和相關資料,歡迎關注,

個人網站"張飛的豬編程作業室"鏈接: https://zhangfeidezhu.com

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/555794.html

標籤:大數據

上一篇:InnoDB 記憶體結構之更改緩沖區

下一篇:返回列表

標籤雲
其他(161478) Python(38244) JavaScript(25512) Java(18251) C(15238) 區塊鏈(8271) C#(7972) AI(7469) 爪哇(7425) MySQL(7260) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4606) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2436) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1971) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • ClickHouse(14)ClickHouse合并樹MergeTree家族表引擎之Versioned

    [toc] >VersionedCollapsingMergeTree引擎繼承自MergeTree并將折疊行的邏輯添加到合并資料部分的演算法中。VersionedCollapsingMergeTree用于相同的目的折疊樹但使用不同的折疊演算法,允許以多個執行緒的任何順序插入資料。特別是,Version列有 ......

    uj5u.com 2023-06-22 08:07:07 more
  • InnoDB 記憶體結構之更改緩沖區

    更改緩沖區(Change Buffer)是一種特殊的資料結構,用于快取不在緩沖池中的二級索引(secondary index)頁的更改。可能來自于 INSERT、UPDATE 或 DELETE 操作(資料操作語言,DML)的緩沖更改,會在后續通過其他讀操作將這些頁加載到緩沖池時被合并。 ......

    uj5u.com 2023-06-21 08:53:09 more
  • 華為云GaussDB為MetaERP“成本核算”產品“保駕護航”

    摘要:華為宣布實作了自主創新的MetaERP研發,并且完成了對舊ERP系統的全面替換,這其中,就采用了華為云GaussDB資料庫特有的全密態技術,對ERP系統中的絕密資料進行加密保護,從而保障了資料的安全。 ERP系統在幫助企業優化業務流程、實作數字化管理方面有重要作用,可以說企業所有的業務流轉都需 ......

    uj5u.com 2023-06-21 08:53:02 more
  • CSR格式如何更新? GES圖計算引擎HyG揭秘之資料更新

    摘要:HyG圖計算引擎采用CSR格式來存盤圖的拓撲資訊,CSR格式可以將稀疏矩陣的存盤空間壓縮,進而大大降低圖的存盤開銷,同時具備訪問效率高、格式易轉化等優點。 本文分享自華為云社區《CSR格式如何更新? GES圖計算引擎HyG揭秘之資料更新》,作者: π 。 HyG圖計算引擎采用CSR格式來存盤圖 ......

    uj5u.com 2023-06-21 08:52:51 more
  • Linux安裝MongoDB 4.0.3

    Linux安裝MongoDB 4.0.3 1.準備 CentOS下安裝MongoDB 官網提供windows、Linux、OSX系統環境下的安裝包,這里主要是記錄一下在Linux下的安裝;首先到官網下載安裝包;文中安裝的是4.0.3版本的。 官網地址:https://www.mongodb.com/ ......

    uj5u.com 2023-06-21 08:52:38 more
  • 華為云GaussDB為MetaERP“成本核算”產品“保駕護航”

    摘要:華為宣布實作了自主創新的MetaERP研發,并且完成了對舊ERP系統的全面替換,這其中,就采用了華為云GaussDB資料庫特有的全密態技術,對ERP系統中的絕密資料進行加密保護,從而保障了資料的安全。 ERP系統在幫助企業優化業務流程、實作數字化管理方面有重要作用,可以說企業所有的業務流轉都需 ......

    uj5u.com 2023-06-21 08:51:32 more
  • InnoDB 記憶體結構之更改緩沖區

    更改緩沖區(Change Buffer)是一種特殊的資料結構,用于快取不在緩沖池中的二級索引(secondary index)頁的更改。可能來自于 INSERT、UPDATE 或 DELETE 操作(資料操作語言,DML)的緩沖更改,會在后續通過其他讀操作將這些頁加載到緩沖池時被合并。 ......

    uj5u.com 2023-06-21 08:50:53 more
  • CSR格式如何更新? GES圖計算引擎HyG揭秘之資料更新

    摘要:HyG圖計算引擎采用CSR格式來存盤圖的拓撲資訊,CSR格式可以將稀疏矩陣的存盤空間壓縮,進而大大降低圖的存盤開銷,同時具備訪問效率高、格式易轉化等優點。 本文分享自華為云社區《CSR格式如何更新? GES圖計算引擎HyG揭秘之資料更新》,作者: π 。 HyG圖計算引擎采用CSR格式來存盤圖 ......

    uj5u.com 2023-06-21 08:50:31 more
  • [20230616]One Deadlock of 'row cache lock' and '

    [20230616]One Deadlock of 'row cache lock' and 'library cache lock'.txt--//鏈接http://ksun-oracle.blogspot.com/2023/06/one-deadlock-of-row-cache-lock-an ......

    uj5u.com 2023-06-20 09:32:04 more
  • MVCC并發版本控制之重點ReadView

    MVCC并發版本控制 本文大部分來自《MySQL是怎樣運行的》,這里只是簡單總結,用于各位回憶和復習。 版本鏈 對于使用 InnoDB 存盤引擎的表來說,它的聚簇索引記錄中都包含兩個必要的隱藏列(不知道的快去看《MySQL是怎樣運行的》) trx_id :每次一個事務對某條聚簇索引記錄進行改動時,都 ......

    uj5u.com 2023-06-20 09:31:55 more