HybridDBforPostgreSQL軌跡相似(伴隨分析)
標籤
PostgreSQL , Greenplum , 伴隨分析 , 軌跡相似
背景
《阿里雲 PostgreSQL 產品生態;案例、開發實踐、管理實踐、學習資料、學習視訊 – 珍藏級》
以上有個CASE是講:如何找出在同一輛車內的人,實際上就是通過車輛、人物的軌跡點資料,進行多輪的求交集,將結果收斂到一個較小的範圍。
Greenplum伴隨分析測試
1、建立測試表
create table tbl_pos (uid int8, phonenum text, ts timestamp, pos geometry, ghash text);
2、寫入測試資料3億條左右
insert into tbl_pos
select uid, md5(uid::text), ts, pos, st_geohash(pos,8) from
(
select
(random()*10000000)::int8 as uid,
ts,
st_setsrid(st_makepoint(120.2+0.5-random(), 30.3+0.5-random()), 4326) as pos
from
generate_series(`2018-01-01`::timestamp, `2019-01-01`::timestamp, interval `0.1 sec`)
t (ts)
) t;
3、重複生成資料到100億
postgres=> insert into tbl_pos select * from tbl_pos;
INSERT 0 315360001
postgres=> iming
Timing is on.
postgres=> insert into tbl_pos select * from tbl_pos;
INSERT 0 630720002
Time: 8992.130 ms (00:08.992)
postgres=> insert into tbl_pos select * from tbl_pos;
INSERT 0 1261440004
Time: 19517.465 ms (00:19.517)
postgres=> insert into tbl_pos select * from tbl_pos;
INSERT 0 2522880008
Time: 37244.890 ms (00:37.245)
postgres=> insert into tbl_pos select * from tbl_pos;
INSERT 0 5045760016
Time: 73391.309 ms (01:13.391)
4、新增索引
create index idx_tbl_pos_1 on tbl_pos(ghash);
create index idx_tbl_pos_2 on tbl_pos using gist(pos);
create index idx_tbl_pos_3 on tbl_pos (ts);
5、收集統計資訊
postgres=> vacuum analyze tbl_pos;
6、伴隨分析
postgres=> select count(*) from tbl_pos where ghash >= `wtmm1k` and ghash < `wtmm1`||chr(ascii(`k`)+1);
count
--------
609632
(1 row)
Time: 60.275 ms
postgres=> select count(*) from tbl_pos where ts between `2018-01-01 00:06:25.2` and `2018-01-01 01:06:25.2` and ghash >= `wtmmmm` and ghash < `wtmmm`||chr(ascii(`m`)+1);
count
-------
69984
(1 row)
Time: 70.161 ms
postgres=> explain select count(*) from tbl_pos where ts between `2018-01-01 00:06:25.2` and `2018-01-01 01:06:25.2` and ghash >= `wtmmmm` and ghash < `wtmmm`||chr(ascii(`m`)+1);
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=10681940.85..10681940.86 rows=1 width=8)
-> Gather Motion 1024:1 (slice1; segments: 1024) (cost=10681930.57..10681940.83 rows=1 width=8)
-> Aggregate (cost=10681930.57..10681930.58 rows=1 width=8)
-> Bitmap Heap Scan on tbl_pos (cost=10520118.62..10681889.69 rows=16 width=0)
Recheck Cond: ts >= `2018-01-01 00:06:25.2`::timestamp without time zone AND ts <= `2018-01-01 01:06:25.2`::timestamp without time zone AND ghash >= `wtmmmm`::text AND ghash < `wtmmmn`::text
-> BitmapAnd (cost=10520118.62..10520118.62 rows=2 width=0)
-> Bitmap Index Scan on idx_tbl_pos_3 (cost=0.00..1751.33 rows=161 width=0)
Index Cond: ts >= `2018-01-01 00:06:25.2`::timestamp without time zone AND ts <= `2018-01-01 01:06:25.2`::timestamp without time zone
-> Bitmap Index Scan on idx_tbl_pos_1 (cost=0.00..10518358.87 rows=97466 width=0)
Index Cond: ghash >= `wtmmmm`::text AND ghash < `wtmmmn`::text
Settings: effective_cache_size=8GB; enable_seqscan=off; gp_statistics_use_fkeys=on; optimizer=off; work_mem=64MB
Optimizer status: legacy query optimizer
(12 rows)
在某5天出現在某個範圍的人的交集:
select uid from
(select distinct uid from tbl_pos where ts between `2018-01-01 00:06:25.2` and `2018-01-01 01:06:25.2` and ghash >= `wtmmmm` and ghash < `wtmmm`||chr(ascii(`m`)+1)) t1
join
(select distinct uid from tbl_pos where ts between `2018-02-01 00:06:25.2` and `2018-02-01 01:06:25.2` and ghash >= `wtmmmm` and ghash < `wtmmm`||chr(ascii(`m`)+1)) t2
using (uid)
join
(select distinct uid from tbl_pos where ts between `2018-03-01 00:06:25.2` and `2018-03-01 01:06:25.2` and ghash >= `wtmmmm` and ghash < `wtmmm`||chr(ascii(`m`)+1)) t3
using (uid)
join
(select distinct uid from tbl_pos where ts between `2018-04-01 00:06:25.2` and `2018-04-01 01:06:25.2` and ghash >= `wtmmmm` and ghash < `wtmmm`||chr(ascii(`m`)+1)) t4
using (uid)
join
(select distinct uid from tbl_pos where ts between `2018-05-01 00:06:25.2` and `2018-05-01 01:06:25.2` and ghash >= `wtmmmm` and ghash < `wtmmm`||chr(ascii(`m`)+1)) t5
using (uid);
uid
-----
(0 rows)
Time: 207.750 ms
小結
1、PostgreSQL bitmap scan支援將多個索引合併,在本例中體現在時間、空間、(其他)條件。
《PostgreSQL 資料庫多列複合索引的欄位順序選擇原理》
《PostgreSQL bitmapAnd, bitmapOr, bitmap index scan, bitmap heap scan》
2、除了使用這種暴力求交集的方法,還有別的方法來計算伴隨麼?相似軌跡分析可能也是一個不錯的選擇
參考
《阿里雲 PostgreSQL 產品生態;案例、開發實踐、管理實踐、學習資料、學習視訊 – 珍藏級》
相關文章
- 伴隨症狀 伴隨因素 迴歸分析 相關係數 多元分析
- 網頁中複雜伴隨式動畫的分析網頁動畫
- 伴隨疫情的網路安全風險
- 求任意矩陣的伴隨矩陣矩陣
- 伴隨我成長的程式設計書程式設計
- 高效採集資料,伴隨應用業務增長
- 伴隨矩陣和逆矩陣的關係證明矩陣
- 陳梓瀚:伴隨我成長的程式設計書程式設計
- JUST技術:如何通過軌跡相似性度量方法,發現新冠易感人群
- 招聘中經常伴隨Java出現的20項技術Java
- Python量化交易進階講堂-視覺化隨機漫步軌跡Python視覺化隨機
- 根據軌跡分析出使用者家在哪
- (?<=p)與:nth-child()的相似性分析
- 時間序列分析 | 相似性度量基本方法
- HybridDBforPostgreSQL(Greenplum)有哪些核心擴充套件SQL套件
- 三星Gear VR新品曝光 伴隨S8一起釋出?VR
- 文章推薦:伴隨我成長的程式設計書 by 陳梓瀚(GeniusVczh)程式設計
- 智慧控制基礎實驗2:根軌跡分析法
- 基於tfidf 以及 lsi 的文字相似度分析
- HybridDBforPostgreSQL,Greenplum寫入效能優化實踐SQL優化
- KITTI_00_SPTAM軌跡和KITTI_00_ORB軌跡ORB
- 解決GAT專案Bug:軌跡分析查詢不到資料
- 大事記管理,OA系統讓員工隨時知曉企業發展軌跡
- ConcurrentHashMap隨意分析HashMap
- 沙雕遊戲營銷伴隨了玩家的一生,從搖籃到墳墓遊戲
- 軌跡規劃理解
- 軌跡資料 (三)
- TUV南德為伴隨診斷試劑(CDx)頒發全球首張IVDR CE證書
- 《火星救援VR》原班人馬打造全新AR遊戲,讓可愛小飛龍伴隨你左右VR遊戲
- 人工智慧之機器學習線代基礎——行列式、矩陣的 逆(inverse)、伴隨矩陣人工智慧機器學習矩陣
- 軌跡聯邦用到的具體公式 + 軌跡模組的設計公式
- Java利用hanlp完成語句相似度分析的方法詳解JavaHanLP
- Leaflet 帶箭頭軌跡以及沿軌跡帶方向的動態marker
- 從行為軌跡進行大資料分析有什麼好處?大資料
- 第8章 紐約計程車軌跡的空間和時間資料分析
- 牛奶咖啡好伴侶——《C程式設計伴侶》對《C程式設計》C程式程式設計
- 聊聊 RocketMQ 訊息軌跡MQ
- 智慧手環軌跡APIAPI