本文為您介紹在Hologres中如何通過寬表實現標籤計算的最佳實務。
背景資訊
離線數倉模型中,使用者標籤資料被分隔成面向主題、維度多張表,這樣的組織形式便於體系化的構建標籤系統及資料維護管理。線上Portrait analysis服務如果按照這樣的資料模型組織標籤資料,不可避免的需要Join多張標籤表來完成多標籤的過濾,這對於資料庫產品開銷太大。
方案介紹
Hologres標籤寬表的方案是指將相對穩定的屬性工作表離線彙總成寬表,將多張表的關聯操作轉化成對一張表的計算,新的標籤列的情境可以通過增加列的方式實現,如下圖所示。這種方案適用於以下情境:
標籤數量較少(小於1000)。
資料穩定(更新較少)。
將資料存在寬表中,多列之間過濾條件的與或非運算將被列存的最佳化機制自動處理,相比任何Join方式都要更加高效;另一方面,Hologres支援列式儲存,不會產生IO放大的問題。使用寬表方案可沿用傳統資料庫模型建模和開發應用。
使用樣本
使用標籤寬表進行Portrait analysis的樣本如下,進行洞察dws_userbase表中[省份='浙江'] & [性別=男性]
在已婚狀態上的統計分析,樣本SQL如下。建議根據查詢方式對錶設定合理的索引,以提升查詢效能,詳情請參見CREATE TABLE。
-- 屬性資料寬表
BEGIN;
CREATE TABLE dws_userbase
(
uid text not null primary key,
province text,
gender text,
married text
... -- 其他屬性列
);
call set_table_property('dws_userbase', 'distribution_key', 'uid');
call set_table_property('dws_userbase', 'bitmap_columns', 'province,gender,married');
END;
-- 洞察基礎屬性
SELECT count(distinct uid) as cnt,
married
FROM dws_userbase ub
WHERE province = '浙江' and gender = '男'
GROUP BY married;