clickHouse-快取引擎

峰二爺發表於2020-12-06

緩衝資料以寫入記憶體,並定期將其重新整理到另一個表。在讀取操作期間,同時從緩衝區和另一個表讀取資料。

Buffer(database, table, num_layers, min_time, max_time, min_rows, max_rows, min_bytes, max_bytes)
引擎引數:
database- 資料庫名稱。可以使用返回字串的常量表示式來代替資料庫名稱。
table –將資料重新整理到的表。
num_layers–並行層。在物理上,該表將表示為num_layers獨立的緩衝區。建議值:16。
min_time,max_time,min_rows,max_rows,min_bytes,和max_bytes-條件從緩衝區重新整理資料。
如果滿足所有min條件或至少一個max條件,則從緩衝區重新整理資料並將其寫入目標表。
min_time,max_time–從第一次寫入緩衝區起的時間(以秒為單位)。
min_rows,max_rows–緩衝區中的行數條件。
min_bytes,max_bytes–緩衝區中位元組數的條件。
在寫操作期間,資料被插入到num_layers許多隨機緩衝區中。或者,如果要插入的資料部分足夠大(大於max_rows或max_bytes),則將其直接寫入目標表,而忽略緩衝區。
對於每個num_layers緩衝區,分別計算重新整理資料的條件。例如,如果num_layers = 16和max_bytes = 100000000,則最大RAM消耗為1.6 GB。
例:
CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer(merge, hits, 16, 10, 100, 10000, 1000000, 10000000, 100000000)
建立一個具有與’merge.hits’相同結構的’merge.hits_buffer’表,並使用Buffer引擎。寫入此表時,資料會緩衝在RAM中,然後再寫入“ merge.hits”表。建立了16個緩衝區。如果經過了100秒,或者已寫入一百萬行,或者已寫入100 MB資料,則將重新整理其中每個資料;或者同時經過10秒並寫入10,000行和10 MB資料。例如,如果只寫了一行,則無論如何,在100秒後它將被重新整理。但是,如果已寫入許多行,則將更快地重新整理資料。
當伺服器停止時,使用DROP TABLE或DETACH TABLE,緩衝區資料也將重新整理到目標表。
您可以在資料庫名稱和表名稱的單引號中設定空字串。這表明沒有目標表。在這種情況下,當達到資料重新整理條件時,只需清除緩衝區。這對於將資料視窗保留在記憶體中可能很有用。
從緩衝區表讀取資料時,將從緩衝區和目標表(如果有的話)中處理資料。
請注意
 緩衝區表不支援索引。換句話說,緩衝區中的資料已被完全掃描,這對於大型緩衝區而言可能很慢。(對於下級表中的資料,將使用其支援的索引。)
 如果“緩衝區”表中的列集與從屬表中的列集不匹配,則插入兩個表中都存在的列子集。
 如果型別與緩衝區表和從屬表中的任一列都不匹配,則會在伺服器日誌中輸入錯誤訊息,並清除緩衝區。
如果重新整理緩衝區時從屬表不存在,也會發生相同的情況。
 如果需要對下級表和Buffer表執行ALTER,建議先刪除Buffer表,對下級表執行ALTER,然後再次建立Buffer表。
 如果伺服器異常重啟,緩衝區中的資料將會丟失。
 FINAL和SAMPLE對於緩衝區表不能正常工作。這些條件將傳遞到目標表,但不用於處理緩衝區中的資料。如果需要這些功能,建議從目標表讀取時僅使用緩衝區表進行寫入。
 將資料新增到緩衝區時,緩衝區之一被鎖定。如果同時從表執行讀取操作,則會導致延遲。
 插入到緩衝區表中的資料可能以不同的順序和不同的塊最終出現在從屬表中。因此,很難使用Buffer表正確地寫入CollapsingMergeTree。為了避免出現問題,可以將“ num_layers”設定為1。
 如果目標表被複制,則寫入緩衝區表時,複製表的某些預期特性會丟失。資料部分的行順序和大小的隨機變化會導致重複資料刪除退出工作,這意味著不可能對複製表進行可靠的“僅一次”寫入。
 由於這些缺點,我們僅建議在極少數情況下使用Buffer表。
 當在一個單位時間內從大量伺服器接收到太多INSERT且無法在插入之前對資料進行緩衝的情況下,將使用Buffer表,這意味著INSERT不能足夠快地執行。
 注意,即使一次插入緩衝區表也沒有意義。這樣只會產生每秒幾千行的速度,而插入更大的資料塊則每秒會產生一百萬行以上的速度(請參閱“效能”一節)。

  1. 建立一個目標表
create table tb_user(uid Int8 , name String) engine=TinyLog ;
  1. 建立一個快取表
CREATE TABLE tb_user_buffer AS tb_user ENGINE = Buffer(merge, hits, 16, 10, 100, 10000, 1000000, 10000000, 100000000) ;
  1. 向快取表中插入資料
insert into tb_user_buffer2 values(1,’zs’),(2,'ls') ,(3,'ww') ;
  1. 等待以後檢視目標表中的資料
select * from tb_user ;

相關文章