天天看點

PgSQL · 應用案例 · 手機行業分析、決策系統設計-實時圈選、透視、估算

經營分析、決策支援是現代企業的一個讓資料發揮有效價值的分析型系統。

在各個行業中随處可見,例如共享充電寶中,協助銷售了解實時的裝置租賃情況,銷售業績。在電商中,協助小二和商戶發掘目标使用者群體。金融行業中,協助輸出國民的存款、消費、貸款的畫像。

PostgreSQL, Greenplum都是非常适合于經營分析、決策支援的資料庫。因為它們具備了一些特性,适合實時的分析透視。(流式計算、合并寫入、閱後即焚、GIN反向索引、varbit類型、列存儲、BITMAP合并掃描、HLL估值類型、采樣算法等等)。

我也寫過很多實際的應用案例,可以參考本文末尾。

經營分析系統的需求大同小異,在手機行業中,以imei或imsi為KEY,每個手機根據它的使用者的行為,生成一些屬性,針對每個屬性,劃分出不同的标簽,形成了手機使用者的畫像。再針對畫像進行人群的圈選、透視,協助分析。

例如,基于PostgreSQL數組以及GIN索引的設計:

PgSQL · 應用案例 · 手機行業分析、決策系統設計-實時圈選、透視、估算

1、目标設計

2、表結構設計

3、屬性表

4、标簽表

5、标簽表索引設計

6、打标簽(含新增、更新、删除标簽)測試

7、圈選測試

8、透視測試

9、決策設計示例

流式+函數式計算

1、手機使用者屬性表

2、标簽中繼資料表

3、标簽表

4、标簽表與屬性表實際上可以合一,在透視時,可以避免一次JOIN(降低透視的耗時),但是會引入更新IO放大的問題,因為屬性表可能是寬表。

根據實際的性能情況來選擇是否合一。

1、圈人

2、針對圈出人群的精準透視

3、新增或追加标簽

使用intarray插件,簡化數組交、并、差操作。

4、删标簽

5、更新标簽

6、批量并行新增、追加、删除、更新标簽優化

如果要一次性操作很多條記錄(例如1000萬條記錄),并且有并行的貼标簽操作(同一條使用者被多個SQL更新)。需要注意兩個問題:

6.1 大事務導緻膨脹的問題,建議分段操作。

6.2 行鎖沖突問題,建議新增(插入),然後合并到标簽表。

優化方法,

實作标簽最終一緻性。

将直接增、删、改标簽表,改成寫行為日志tag_log,采用任務排程,批量合并到标簽表:

串行任務,閱後即焚(假設-99999999是一個永遠不存在的TAGID)

并行任務,閱後即焚

寫成函數,友善調用

建立排程任務,執行消費函數排程即可。

閱後即焚的處理速度,每秒 百萬行。

<a href="../201711/20171107_32.md">《(OLTP) 高吞吐資料進出(堆存、行掃、無需索引) - 閱後即焚(讀寫大吞吐并測)》</a>

1、标簽取值範圍5萬,正态分布

PgSQL · 應用案例 · 手機行業分析、決策系統設計-實時圈選、透視、估算

2、多表批量寫入函數

3、多表批量消費

标簽表分表

多表批量消費

4、資料寫入壓測腳本

5、資料消費,并行排程

用秒殺技術實作并行排程,避免單個HASH被重複調用。

<a href="../201711/20171107_31.md">《HTAP資料庫 PostgreSQL 場景與性能測試之 30 - (OLTP) 秒殺 - 高并發單點更新》</a>

這裡直接用分區表寫入的話,性能會更爽,原理請看如下:

<a href="../201709/20170906_01.md">《阿裡雲RDS PostgreSQL OSS 外部表 - (dblink異步調用封裝)并行寫提速案例》</a>

6、壓測結果

寫入速度

消費速度

查詢速度,毫秒級

除了以上基于數組、GIN索引的設計,PostgreSQL還有一些技術,可以用在經營分析系統。

通過insert on conflict,流式的統計固定模型的次元資料。

<a href="../201711/20171123_02.md">《PostgreSQL 流式統計 - insert on conflict 實作 流式 UV(distinct), min, max, avg, sum, count …》</a>

滿足這類查詢的實時流式統計:

通過insert on conflict,流式的統計固定模型的次元資料。這裡要用到hll插件,存儲count(dinstinct x)的估值

<a href="../201302/20130228_01.md">《PostgreSQL hll (HyperLogLog) extension for “State of The Art Cardinality Estimation Algorithm” - 3》</a>

<a href="../201302/20130227_01.md">《PostgreSQL hll (HyperLogLog) extension for “State of The Art Cardinality Estimation Algorithm” - 2》</a>

<a href="../201302/20130226_01.md">《PostgreSQL hll (HyperLogLog) extension for “State of The Art Cardinality Estimation Algorithm” - 1》</a>

根據執行計劃得到評估行。

<a href="../201509/20150919_02.md">《妙用explain Plan Rows快速估算行》</a>

如果輸入多個字段條件,為了提高行估算準确度,可以定義多字段統計資訊,10新增的功能:

<a href="../201709/20170902_02.md">《PostgreSQL 10 黑科技 - 自定義統計資訊》</a>

滿足這類查詢的估算需求:

<a href="../201709/20170911_02.md">《秒級任意次元分析1TB級大表 - 通過采樣估值滿足高效TOP N等統計分析需求》</a>

采樣估算,适合求TOP N。

反向索引針對多值類型,例如 hstore, array, tsvector, json, jsonb。

主樹的K-V分别為:

輔樹為

進而高效的滿足這類查詢的需求:

内部使用BITMAP掃描方法,過濾到少量資料塊。

<a href="../201706/20170627_01.md">《PostgreSQL 9種索引的原理和應用場景》</a>

這個方法非常的巧妙,将tag和imei做了倒轉,以tag為key, imei為bitmap來存儲。

查詢換算:

案例參考:

<a href="../201705/20170502_01.md">《阿裡雲RDS for PostgreSQL varbitx插件與實時畫像應用場景介紹》</a>

<a href="../201610/20161021_01.md">《基于 阿裡雲 RDS PostgreSQL 打造實時使用者畫像推薦系統(varbitx)》</a>

PostgreSQL 10加入了并行計算的能力,在join , filter, seqscan, order by, agg, group等方面都支援并行。

性能名額參考:

<a href="../201711/20171107_24.md">《HTAP資料庫 PostgreSQL 場景與性能測試之 23 - (OLAP) 并行計算》</a>

基于PostgreSQL的MPP 資料倉庫Greenplum,支援列存儲,位圖索引。

用資源,暴力解決問題。

沒有太多的設計技巧,堆機器就可以,但是本身的效率遠比impalar, hive好很多。

Greenplum是非常值得推薦的OLAP資料庫。在金融、政府、航空等大資料領域有衆多案例。

流式資料處理+UDF函數計算技術。可以滿足實時決策的需求。

案例如下:

<a href="../201711/20171107_33.md">《HTAP資料庫 PostgreSQL 場景與性能測試之 32 - (OLTP) 高吞吐資料進出(堆存、行掃、無需索引) - 閱後即焚(JSON + 函數流式計算)》</a>

<a href="../201711/20171107_28.md">《HTAP資料庫 PostgreSQL 場景與性能測試之 27 - (OLTP) 物聯網 - FEED日志, 流式處理 與 閱後即焚 (CTE)》</a>

1、實時統計 count(distinct)估值,min, max, avg, sum, count精确值。

2、

<a href="../201711/20171111_01.md">《PostgreSQL 異步消息實踐 - Feed系統實時監測與響應(如 電商主動服務) - 分鐘級到毫秒級的實作》</a>

<a href="../201711/20171107_28.md">《(OLTP) 物聯網 - FEED日志, 流式處理 與 閱後即焚 (CTE)》</a>

3、讓explain産生精确的多字段輸入條件行數估值(<code>select * from table where a=? and|or b=? ....</code>)

5、決策支援,流式函數計算

<a href="../201711/20171107_33.md">《(OLTP) 高吞吐資料進出(堆存、行掃、無需索引) - 閱後即焚(JSON + 函數流式計算)》</a>

6、圈人案例

<a href="../201711/20171107_20.md">《(OLAP) 使用者畫像圈人場景 - 數組相交查詢與聚合》</a>

<a href="../201711/20171107_19.md">《(OLAP) 使用者畫像圈人場景 - 數組包含查詢與聚合》</a>

7、時間、空間、多元圈人、透視案例

<a href="../201709/20170918_02.md">《空間|時間|對象 圈人 + 透視 - 暨PostgreSQL 10與Greenplum的對比和選擇》</a>

<a href="../201706/20170629_01.md">《PostgreSQL\GPDB 毫秒級海量 時空資料透視 典型案例分享》</a>

<a href="../201706/20170625_01.md">《PostgreSQL\GPDB 毫秒級海量 多元資料透視 案例分享》</a>

8、視訊網站透視案例

<a href="../201708/20170827_01.md">《音視圖(泛内容)網站透視分析 DB設計 - 阿裡雲(RDS、HybridDB) for PostgreSQL最佳實踐》</a>

9、

<a href="../201709/20170918_01.md">《畫像圈人 + 人群行為透視》</a>

<a href="../201704/20170413_02.md">《奔跑吧,大屏 - 時間+空間 實時四維資料透視》</a>

<a href="../201703/20170307_01.md">《資料透視 - 商場(如沃爾瑪)選址應用》</a>

<a href="../201709/20170915_01.md">《海量使用者實時定位和圈人 - 團圓社會公益系統(位置尋人\圈人)》</a>

<a href="../201708/20170823_01.md">《萬億級電商廣告 - brin黑科技帶你(最低成本)玩轉毫秒級圈人(視覺挖掘姊妹篇) - 阿裡雲RDS PostgreSQL, HybridDB for PostgreSQL最佳實踐》</a>

<a href="../201706/20170607_02.md">《多字段,任意組合條件查詢(無需模組化) - 毫秒級實時圈人 最佳實踐》</a>

10、

<a href="../201709/20170923_01.md">《經營、銷售分析系統DB設計之PostgreSQL, Greenplum - 共享充電寶 案例實踐》</a>

繼續閱讀