Doris----ロールアップテーブル分析とケースの実装

ROLLUP は、多次元分析における「ロールアップ」を意味し、指定された粒度でデータをさらに集計することを意味します。

以前の集計モデル:

ユーザーID データ挿入時間 性別 前回の訪問時間 このユーザーの総消費量 このユーザーの最大滞在期間 ユーザーの最低滞在期間
10000 2017/10/2 北京 10 0 2017/10/02 08:00:00 65 15 2
10000 2017/10/2 北京 20 0 2017/10/02 08:00:00 65 15 2
10000 2017/10/2 北京 30 0 2017/10/02 08:00:00 65 15 2
10000 2017/10/1 上海 20 0 2017/10/01 08:00:00 100 122 2
10000 2017/10/2 上海 20 0 2017/10/02 08:00:00 30 30 2
10000 2017/10/3 上海 10 0 2017/10/03 08:00:00 55 33 2
10000 2017/10/4 上海 20 0 2017/10/04 08:00:00 65 15 2
10001 2017/10/1 上海 30 1 2017/10/01 17:05:45 20 22 22
10001 2017/10/2 上海 10 1 2017/10/01 17:05:45 10 123 22
10001 2017/10/2 天津 10 1 2017/10/01 17:05:45 18 2 22
10001 2017/10/1 上海 10 1 2017/10/01 17:05:45 10 123 22
10001 2017/10/1 天津 10 1 2017/10/01 17:05:45 18 2 22
10001 2017/10/1 天津 20 1 2017/10/01 17:05:45 28 45 22
10002 2017/10/1 天津 30 1 2017/10/01 17:05:45 35 11 22
10002 2017/10/2 天津 10 1 2017/10/01 08:00:00 20 23 2
10002 2017/10/2 北京 20 1 2017/10/03 17:05:45 35 11 22
10002 2017/10/1 天津 10 1 2017/10/01 08:00:00 20 23 2
10002 2017/10/3 北京 20 1 2017/10/03 17:05:45 35 11 22
10002 2017/10/3 北京 30 1 2017/10/03 08:00:00 20 23 2

 1.各都市各ユーザー1 日あたりの売上合計を求めます。

select 
user_id,city,date,
sum(sum_cost) as sum_cost
from t
group by user_id,city,date

 

-- user_id      date             city      sum_cost
   10000        2017/10/2        北京        195
   10000        2017/10/1        上海        100
   10000        2017/10/2        上海        30 
   10000        2017/10/3        上海        55 
   10000        2017/10/4        上海        65 
   10001        2017/10/1        上海        30
   10001        2017/10/2        上海        10        
   10001        2017/10/2        天津        18         
   10001        2017/10/1        天津        46
   10002        2017/10/1        天津        55
   10002        2017/10/3        北京        55 
   10002        2017/10/2        天津        20        
   10002        2017/10/2        北京        35        

 2. 各ユーザーおよび各都市の総消費量を求める

select 
user_id,city,
sum(sum_cost) as sum_cost
from t
group by user_id,city
user_id      city       sum_cost
10000        北京        195
10000        上海        100
10001        上海        40
10001        天津        64
10002        天津        75
10002        北京        90

 3. 各ユーザーの合計消費量を求める

select 
user_id,
sum(sum_cost) as sum_cost
from t
group by user_id
user_id        sum_cost
10000            295
10001            104
10002            165

 

 1基本的な考え方

表作成文で作成した表を実表(ベーステーブル、実表)といいます。

Base テーブルの上に、任意の数の ROLLUP テーブルを作成できます。これらの ROLLUP データはベース テーブルに基づいて生成され、物理的に独立して保存されます

ロールアップ テーブルの利点:

  1. ベース テーブルと同じテーブル名を共有する doris は、結果を計算するための特定のクエリ ロジックに従って適切なデータ ソース (適切なテーブル) を選択します。

  2. ベーステーブルのデータを追加、削除、変更すると、ロールアップテーブルは自動的に更新され、同期されます。

 2 集約モデルの ROLLUP

 以前に作成されたテーブルを確認してください。

mysql> desc ex_user all;  

例 1: ユーザーの合計消費量を表示する

ロールアップテーブルの追加/削除

alter table aggregate表名 add rollup "rollup表的表名" (user_id,city,date,cost);

alter table ex_user add rollup rollup_ucd_cost(user_id,city,date,cost);
alter table ex_user add rollup rollup_u_cost(user_id,cost);
alter table ex_user add rollup rollup_cd_cost(city,date,cost);

alter table ex_user drop rollup rollup_u_cost;
alter table ex_user drop rollup rollup_cd_cost;

--如果是replace聚合类型得value,需要指定所有得key
-- alter table ex_user add rollup rollup_cd_visit(city,date,last_visit_date);
-- ERROR 1105 (HY000): errCode = 2, detailMessage = Rollup should contains 
-- all keys if there is a REPLACE value

--添加完成之后可以show一下,看看底层得rollup有没有执行完成
SHOW ALTER TABLE ROLLUP;

Doris は自動的に ROLLUP テーブルにアクセスするため、集計クエリを完了するためにスキャンする必要があるのはごく少量のデータだけです。

explain SELECT user_id, sum(cost) FROM ex_user GROUP BY user_id;

 

複製モデルの ROLLUP

ROLLUP はプレフィックス インデックスを調整します (新しいプレフィックス インデックスのセットを追加します)。

テーブルの作成時に列の順序が指定されているため、テーブルにはプレフィックス インデックスが 1 つだけあります。これは、プレフィックス インデックスにヒットできない他の列を条件として使用するクエリの場合、十分に効率的ではない可能性があります。したがって、ROLLUP を作成することで列の順序を手動で調整できます。

ベーステーブルの構造は次のとおりです。

列名 タイプ
ユーザーID BIGINT
INT
メッセージ VARCHAR(100)
max_dwell_time 日付時刻
min_dwell_time 日付時刻

 これに基づいて ROLLUP テーブルを作成できます。

列名 タイプ
INT
ユーザーID BIGINT
メッセージ VARCHAR(100)
max_dwell_time 日付時刻
min_dwell_time 日付時刻

 ご覧のとおり、ROLLUP テーブルとベース テーブルの列は、user_id と age の順序が逆になっている点を除いて、まったく同じです。したがって、次のクエリを作成すると、次のようになります。

SELECT * FROM table where age=20 and message LIKE "%error%";

 ROLLUP プレフィックス インデックスの一致度が高いため、ROLLUP テーブルが優先されます。

 

ROLLUP の使用説明書

  1. ROLLUP はベース テーブルに付加されます。ユーザーはベース テーブルに基づいて ROLLUP を作成または削除できますが、クエリで特定の ROLLUP を明示的に指定することはできません。ROLLUP を押すかどうかは Doris システムによって完全に自動的に決定されます。

  2. ROLLUP データは物理的に独立して保存されます。したがって、作成される ROLLUP が増えるほど、占有されるディスク領域も増えます。同時に、インポート速度にも影響しますが、クエリ効率は低下しません (改善されるだけです)。

  3. ROLLUP のデータ更新はベーステーブルと完全に同期されます。ユーザーはこの問題について心配する必要はありません。

  4. 集計モデルでは、ROLLUP の列の集計タイプはベース テーブルとまったく同じです。ROLLUP の作成時に指定する必要はなく、変更することもできません。

  5. EXPLAIN your_sql; コマンドを使用してクエリ実行プランを取得できます。実行プランで ROLLUP がヒットするかどうかを確認します。

  6. DESC tbl_name ALL; ステートメントを使用して、ベース テーブルと作成されたすべての ROLLUP を表示できます。

 

おすすめ

転載: blog.csdn.net/m0_53400772/article/details/130916112