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 データはベース テーブルに基づいて生成され、物理的に独立して保存されます。
ロールアップ テーブルの利点:
-
ベース テーブルと同じテーブル名を共有する doris は、結果を計算するための特定のクエリ ロジックに従って適切なデータ ソース (適切なテーブル) を選択します。
-
ベーステーブルのデータを追加、削除、変更すると、ロールアップテーブルは自動的に更新され、同期されます。
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;
3 複製モデルの 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 の使用説明書
-
ROLLUP はベース テーブルに付加されます。ユーザーはベース テーブルに基づいて ROLLUP を作成または削除できますが、クエリで特定の ROLLUP を明示的に指定することはできません。ROLLUP を押すかどうかは Doris システムによって完全に自動的に決定されます。
-
ROLLUP データは物理的に独立して保存されます。したがって、作成される ROLLUP が増えるほど、占有されるディスク領域も増えます。同時に、インポート速度にも影響しますが、クエリ効率は低下しません (改善されるだけです)。
-
ROLLUP のデータ更新はベーステーブルと完全に同期されます。ユーザーはこの問題について心配する必要はありません。
-
集計モデルでは、ROLLUP の列の集計タイプはベース テーブルとまったく同じです。ROLLUP の作成時に指定する必要はなく、変更することもできません。
-
EXPLAIN your_sql; コマンドを使用してクエリ実行プランを取得できます。実行プランで ROLLUP がヒットするかどうかを確認します。
-
DESC tbl_name ALL; ステートメントを使用して、ベース テーブルと作成されたすべての ROLLUP を表示できます。