當前熱文:Doris 的高級特性

2023-01-16 11:19:43 來源:51CTO博客

一、表結(jié)構(gòu)變更

添加列:alter table table1 add column uv bigint sum default ‘0’ after pv;


【資料圖】

刪除列:alter table table1 drop column uv;

查看狀態(tài):show alter table column;

取消操作:cancel alter table column from table1;

二、Rollup

概念

在 Doris 中,源表稱為 Bash 表,在 Base 表之上可以創(chuàng)建多個 Rollup 表,Rollup 表是基于 Base 表產(chǎn)生,在物理上是獨立存儲

Rollup 最根本的作用就是提高某些查詢效率,Rollup 創(chuàng)建完成之后的觸發(fā)是程序自動的,數(shù)據(jù)更新與 Base 表完全同步

在創(chuàng)建 Rollup 無需指定,也不能修改,查詢能否命中 Rollup 的必要條件是查詢所涉及的所有列都存在 Rollup 的列中

創(chuàng)建

alter table table2 add rollup rollup_city(citycode,pv);

desc table2;

查看完成狀態(tài)

show alter table rollup;

查詢執(zhí)行計劃是否命中

explain select citycode,sum(pv) from table2 group by citycode;

查看是否有 rollup: rollup_city

三、增大內(nèi)存

Doris 每個用戶默認設置內(nèi)存限制 2g,SHOW VARIABLES LIKE “%mem_limit%” 命令查看

臨時修改:SET exec_mem_limit = 123456789;

永久有效:SET GLOBAL exec_mem_limit = 123456789;

四、修改超時時間

查看:show variables like “%query_timeout%”;

臨時修改:SET query_timeout = 60;

永久有效:SET global query_timeout = 60;

五、Broadcast/Shuffle Join

概念

Doris 在 join 操作的時候,默認使用 broadcast 的方式進行 join,即將小表通過廣播的方式播到大表所在的節(jié)點,形成內(nèi)存 hash,然后流式讀出大表數(shù)據(jù)進行 hash join

如果小表數(shù)據(jù)量也很大的時候,會造成內(nèi)存溢出,需要通過 shuffle join 的方式進行,也被稱為 partition join,即將大表小表都按照 join 的 key 進行 hash,然后進行分布式 join

Broadcast 適合小表和大表 join,Shuffle join 適合大表和大表

使用 Broadcast Join 默認

select sum(table1.pv) from table1 join table2 where table1.siteid = 1;

顯示指定:select sum(table1.pv) from table1 join [broadcast] table2 where table1.siteid = 1;

使用 Shuffle Join

select sum(table1.pv) from table1 join [shuffle] table2 where table1.siteid = 1;

六、數(shù)據(jù)模型

概念

在 Doris 中,數(shù)據(jù)以表 Table 的形式進行邏輯上的描述,一張表包括 行 Row 和 列 Column。

Row 是一行數(shù)據(jù),Column 是一行數(shù)據(jù)中的不同字段,Column 可以分為 Key(緯度列)和 Value(指標列)兩大類

Aggregate 模型

概念

聚合模型的特點就是將表中的列分為 Key 和 Value 兩種,Key 就是數(shù)據(jù)的緯度列,Value 就是數(shù)據(jù)的指標列,每個指標列還會有自己的聚合函數(shù),數(shù)據(jù)會根據(jù)緯度列進行分組,并對指標列進行聚合

選擇建議

Aggregate 模型可以通過預聚合,極大降低聚合查詢時需要掃描的數(shù)據(jù)量和查詢的計算量,非常適合有固定模式的報表類查詢場景

但是,對 count(*) 很不友好,做其他類型的聚合查詢時,需要考慮語意正確性

聚合方式

SUM:求和,多行 Value 進行累加

REPLACE:替代,下一批數(shù)據(jù)的 Value 會替換之前導入過的 Value

MAX:保留最大值

MIN:保留最小值

觸發(fā)場景

導入、Compaction 合并、查詢

明細數(shù)據(jù)問題

經(jīng)過聚合之后,Doris 中最終只會存儲聚合后的數(shù)據(jù),換句話來說,明細數(shù)據(jù)會丟失,用戶不能夠再查詢到聚合前的明細數(shù)據(jù)

要保留明細數(shù)據(jù)可以添加一個時間戳 timestamp DATETIME 字段,讓它的 key 都不相同

導入數(shù)據(jù)與已有數(shù)據(jù)聚合問題

先導的數(shù)據(jù)和新導入的數(shù)據(jù)之間有相同的適合,也是需要進行一個合并的

Uniq 模型

概念

唯一主鍵模型,本質(zhì)是聚合模型的 REPLACE 方式、一個特例

場景

適合數(shù)據(jù)需要保證主鍵唯一性,沒有聚合需求的場景,可以保證主鍵唯一性約束

選擇建議

需要唯一主鍵約束的場景,但是無法利用 Rollup 等預聚合帶來的查詢優(yōu)勢

Duplicate 模型

概念

Duplicate Key 的模型,數(shù)據(jù)完全按照導入文件中的數(shù)據(jù)進行存儲,不會有任何聚合,即兩行數(shù)據(jù)完全相同,也都會保留

在建表語句中指定的 DUPLICATE KEY,只是用來指明底層數(shù)據(jù)按照那些列進行排序

場景

對于有些日志分析不太在意數(shù)據(jù)多幾條或者少幾條,可能只關(guān)心排序,這時候可能重復 Key 的模型會更加有效果

適合既沒有主鍵,也沒有聚合需求的場景,可以發(fā)揮列存模型的優(yōu)勢

選擇建議

Duplicate 適合任意緯度的 Ad-hoc 查詢,雖然不能利用預聚合的特性,但是不受聚合模型的約束,可以發(fā)揮列存模型的優(yōu)勢

注意:數(shù)據(jù)模型在建表的時候已經(jīng)確定,且無法修改,選擇一個合適的數(shù)據(jù)模型非常重要

七、索引

概念:用于幫助快速過濾或查找數(shù)據(jù)

分類

內(nèi)建的智能索引,包括前綴索引和 ZoneMap 索引

用戶創(chuàng)建的二級索引,包括 Bloom Filter 索引和 Bitmap 倒排索引

Doris 前綴索引

概念:在排序的基礎上,實現(xiàn)一種根據(jù)給定前綴列,快速查詢數(shù)據(jù)的索引方式,將一行數(shù)據(jù)的前 36個字節(jié) 作為這一行數(shù)據(jù)的前綴索引,遇到 varchar 類型直接截斷

匹配規(guī)則

Doris 的前綴索引應用于 on 和 where,且條件表達式需要是 =,<,>,<=,>=,in,between 邏輯表達式需要是 and

where 舉例:第一個條件字段和前綴索引的第一個字段進行比較,如果匹配上,繼續(xù)往下比較,如果匹配不上,停止比較,后面的字段匹配原理和第一個字段一樣

Rollup 調(diào)整前綴索引

在 Base 表上創(chuàng)建一個 Rollup 表,把字節(jié)小的字段放前面,匹配的適合先命中 Rollup 表

八、物化視圖

概念:包含了查詢結(jié)果的數(shù)據(jù)庫對象,在 Doris 中的物化視圖,就是查詢結(jié)果預先存儲起來的特殊表

優(yōu)勢

對于經(jīng)常重復使用相同的子查詢結(jié)果的查詢性能大幅提升

Doris 自動更新物化視圖的數(shù)據(jù),保證 base 表和物化視圖的數(shù)據(jù)一致性,無需額外的維護成本

查詢的適合也可以自動匹配最優(yōu)的物化視圖

Rollup 對比

Rollup 功能通過預聚合方式提升查詢效率,但 Rollup 具有一定的局限性,不能基于明細模型做預聚合,物化視圖包含了 Rollup 的功能,同時又提供了更多功能,是 Rollup 的一個超集

創(chuàng)建

CREATE MATERIALIZED VIEW mv_1 AS SELECT a,b,SUM? FROM table GROUP BY a,b;

匹配

先判斷 where 是否有這個字段,再判斷 select 是否有這個字段

其他點

操作:支持聚合函數(shù),Drop 刪除

局限性:聚合僅支持單列;刪除數(shù)據(jù)的時候如果條件列不在視圖里,需要先刪視圖;視圖過多會影響導入效率;相同列不同聚合函數(shù)不能出現(xiàn)在同一視圖內(nèi);針對 Unique Key 模型只能改變順序,不能起到聚合功能

九、動態(tài)分區(qū)

官方文檔:https://doris.apache.org/zh-CN/docs/advanced/partition/dynamic-partition

功能

對表級別的分區(qū)實現(xiàn)生命周期管理,減少使用負擔,建表的時候設定動態(tài)分區(qū)規(guī)則,F(xiàn)E 會啟動一個后臺線程,根據(jù)指定的規(guī)則創(chuàng)建或刪除分區(qū),運行時也可以變更

配置

fe.conf、MySQL、HTTP

注意

動態(tài)分區(qū)只支持 Range 分區(qū)

某些使用場景下,按天進行分區(qū),每天定時執(zhí)行例行任務,這時需要使用手動管理分區(qū),否則可能由于沒有創(chuàng)建分區(qū)導致數(shù)據(jù)導入失敗,增加維護成本

十、數(shù)據(jù)導出

概述:以文本格式,通過 Broker 進程導出到遠端存儲上

官方文檔:https://doris.apache.org/zh-CN/docs/data-operate/export/export-manual

十一、Colocation Join

概述:為某些 Join 查詢提供本地性優(yōu)化,來減少數(shù)據(jù)在節(jié)點間傳輸耗時,加速查詢

原理:將擁有相同 Colocation Group Schema 的 Table 組成一個 Colocation Group,并保證這些 Table 對應數(shù)據(jù)分片會落在同一個 BE 節(jié)點上,進行 Join 操作時,可以直接進行本地數(shù)據(jù) Join

官方文檔:https://doris.apache.org/zh-CN/docs/advanced/join-optimization/colocation-join

十二、SQL 函數(shù)

查看函數(shù)名:show builtin functions in test_db;

數(shù)學函數(shù)

abs:返回絕對值

bin:返回整型的二進制表示

ceil(double a)/ceiling(double a)/dceil(double a):返回大于等于該參數(shù)的最小整數(shù),向上取整

floor:向下取整

fmod:取模

greatest(bigint a[,bigint b …]):最大值

least(bigint a[,bigint b …]):最小值

mod:余數(shù)

negative:符號取反

pi:PI 值

pow(x,y):x 的 y 次方

positive:返回原值

rand/random:隨機數(shù)

sign:整數(shù)或0 返回 1,負數(shù)返回 -1

sqrt:返回 a 的平方根

日期函數(shù)

https://doris.apache.org/zh-CN/docs/sql-manual/sql-functions/date-time-functions/convert_tz/

地理位置函數(shù)

https://doris.apache.org/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_astext

字符串函數(shù)

https://doris.apache.org/zh-CN/docs/sql-manual/sql-functions/string-functions/ascii

聚合函數(shù)

https://doris.apache.org/zh-CN/docs/sql-manual/sql-functions/aggregate-functions/approx_count_distinct

Bitmap 函數(shù)

https://doris.apache.org/zh-CN/docs/sql-manual/sql-functions/bitmap-functions/to_bitmap

標簽: 數(shù)據(jù)模型 聚合模型 方式進行

上一篇:MySQL的下載配置以及與Navica的連接
下一篇:當前關(guān)注:HBase的索引