
一、表結(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ù)模型 聚合模型 方式進行