數(shù)倉(cāng)調(diào)優(yōu)|阿里資深技術(shù)專家數(shù)倉(cāng)調(diào)優(yōu)經(jīng)驗(yàn)分享(下)

(一)營(yíng)銷業(yè)務(wù)使用場(chǎng)景
核心表建表語(yǔ)句如下:CREATE?TABLE?db.order (
??order_id,
??user_id,
??shop_vip,
??last_trade_time,
??last_cart_time,
??member_grade,
??seller_zone,
??member_credits,
??clustered key?index_mmsi(`user_id`)
)
DISTRIBUTED?BY?HASH(order_id)
PARTITION?BY?VALUE(DATE_FORMAT(last_trade_time, '%Y%m%d')) LIFECYCLE 30
COMMENT?'訂單信息表';
1.人群透視
SELECT
??t2.buyer_id,
??t3.seller_id,
??t1.shop_vip,
??t1.last_trade_time,
??t1.last_cart_time,
??t1.member_grade,
??t1.seller_zone,
??t1.member_credits,
??sum(t1.pay_amount)
FROM
??db.order t1
??JOIN?db.dimension_table1 t2 ON?t1.user_id= t2.buyer_id
??JOIN?db.dimension_table2 t3 ON?t1.user_id= t3.seller_id
WHERE
??t1.is_market_target IN('4')
??AND?t1.seller_zone = 1019
??AND?t1.attributes IN('6742081')
??AND?t3.buyer_id = ‘xxxx’
??and?t3.tseller_id = ‘yyyy’
group?by
??t2.buyer_id,
??t3.seller_id,
??t1.shop_vip,
??t1.last_trade_time,
??t1.last_cart_time,
??t1.member_grade,
??t1.seller_zone,
??t1.member_credits;
2.人群圈選
COUNT DISTINCT或者GROUP BY的操作。典型的SQL語(yǔ)句如下:SELECT?count(1) AS?cnt
??FROM(
SELECT?DISTINCT?t1.buyer_id
??FROM(
SELECT?buyer_id
??FROM?db.order
?WHERE?seller_zone= 11111
???AND?seller_id= 121211121
???AND?algorithm_crowd IN('84')) t1
?JOIN(
SELECT?user_id AS?buyer_id
??FROM?db.dimension_table1) t2
??????ON?t1.buyer_id= t2.buyer_id
JOIN(
SELECT?user_id AS?seller_id
??FROM?db.dimension_table2) t3
??????ON?t1.buyer_id= t3.seller_id
) t;
CREATE?TABLE?output?WITH(oss_dump_endpoint= 'xxxxxx.oss-internal.aliyun-inc.com', oss_dump_bucket_name= 'xxxx',
?????????????????????????oss_dump_file_name= 'xx_prod/20190710/63218721',
?????????????????????????oss_dump_is_overwrite= true,
?????????????????????????oss_dump_compatibility_mode= false,
?????????????????????????oss_dump_access_key_id= 'xxxxxxxxx',
?????????????????????????oss_dump_access_key_secret= 'xxxxxxxxxxxxxxxxxxxx',
?????????????????????????oss_dump_row_del= '\r\n',
?????????????????????????oss_dump_col_del= '\t', table_type= 'oss_dump', dump_charset_code= 'UTF-8',
?????????????????????????oss_dump_table_header= 'false', return_dump_result_count= true) as
SELECT?DISTINCT?t1.buyer_id
??FROM(
SELECT?buyer_id
??FROM?db.order
?WHERE?last_cart_time>= 20190610
???AND?last_cart_time< 20190710
???AND?is_market_target IN('1')
???AND?seller_zone= 1018
???AND?seller_id= 3687815378) t1
JOIN(
SELECT?user_id AS?buyer_id
??FROM?db.dimension_table) t2
ON?t1.buyer_id= t2.buyer_id
LIMIT?1000;

表要設(shè)置主鍵。主鍵用于排重,一旦有重復(fù)的數(shù)據(jù)寫(xiě)入可以直接覆蓋,參考之前上篇:全網(wǎng)首發(fā)|阿里資深技術(shù)專家數(shù)倉(cāng)調(diào)優(yōu)經(jīng)驗(yàn)分享(上)。 表要設(shè)計(jì)二級(jí)分區(qū)。一來(lái)該類數(shù)據(jù)往往量比較大,需要采用二級(jí)分區(qū)做數(shù)據(jù)的生命周期管理,自動(dòng)淘汰過(guò)期的數(shù)據(jù);二是實(shí)時(shí)寫(xiě)入的數(shù)據(jù)可以根據(jù)二級(jí)分區(qū)來(lái)構(gòu)建索引,這樣只需要增量數(shù)據(jù)構(gòu)建索引,大大提高了構(gòu)建索引的效率,有了索引后,數(shù)據(jù)的查詢也就能快很多。 在特別大量的數(shù)據(jù)寫(xiě)入情況下,往往CPU的消耗也比較厲害,需要合理控制構(gòu)建索引任務(wù)的并發(fā)度和時(shí)間,以避免和大流量寫(xiě)入峰值重合,而加重對(duì)實(shí)時(shí)寫(xiě)入的影響。
CREATE?TABLE?tb__record_info
(
??a_info_id bigint?NOT?NULL?AUTO_INCREMENT,
??domain?varchar?NOT?NULL,
??region varchar?NOT?NULL,
??ip varchar?NOT?NULL,
??result_ts varchar?NOT?NULL,
??time_stamp timestamp?NOT?NULL?DEFAULT?CURRENT_TIMESTAMP?ON?UPDATE?CURRENT_TIMESTAMP,
??key?idx_domain(domain),
??key?idx_time(time_stamp),
??primary key?(a_info_id, domain, time_stamp)
)
DISTRIBUTE?BY?HASH(domain)
PARTITION?BY?VALUE(DATE_FORMAT(time_stamp,'%Y%m%d')) LIFECYCLE 60;(三)游戲行業(yè)的使用場(chǎng)景
提供全面的游戲運(yùn)營(yíng)指標(biāo)分析功能:全面提高游戲開(kāi)發(fā)者的日常數(shù)據(jù)運(yùn)營(yíng)工作效率,不僅提供付費(fèi)用戶、付費(fèi)率、付費(fèi)金額和ARPU等運(yùn)營(yíng)指標(biāo),還強(qiáng)化了付費(fèi)用戶的留存率、回訪率、用戶生命周期價(jià)值等更加精細(xì)化的運(yùn)營(yíng)指標(biāo),游戲開(kāi)發(fā)者可以更加深入,更加有效率地掌握游戲運(yùn)營(yíng)狀態(tài)。 提供有效的渠道效果分析,使每分錢(qián)都花在刀刃上:實(shí)時(shí)的分渠道數(shù)據(jù)統(tǒng)計(jì)可以監(jiān)測(cè)到不同渠道用戶的增長(zhǎng)、活躍、留存狀況以及充值狀況,更加全面、快速地分析出投資回報(bào)率,讓開(kāi)發(fā)者對(duì)渠道的評(píng)估更加準(zhǔn)確。 針對(duì)付費(fèi)用戶追蹤分析,了解付費(fèi)用戶的習(xí)慣:針對(duì)付費(fèi)用戶群,通過(guò)簡(jiǎn)單易懂的數(shù)據(jù)分析模型和圖表,跟蹤付費(fèi)用戶的留存、流失、回訪和充值數(shù)據(jù),更好地反映付費(fèi)用戶在整個(gè)生命周期的關(guān)鍵行為和價(jià)值。 細(xì)致分析玩家游戲行為,改進(jìn)產(chǎn)品體驗(yàn),提高游戲收益:關(guān)卡、道具、消費(fèi)行為分析的功能可以了解道具和物品在使用過(guò)程中使用和消耗的總量以及趨勢(shì),開(kāi)發(fā)者可以借此來(lái)做到恰到好處的數(shù)值平衡設(shè)計(jì),也可充分利用數(shù)據(jù)分析的結(jié)果優(yōu)化游戲內(nèi)付費(fèi)商品的收益。
1.活躍分析

SELECT?count(DISTINCT?uid) AS?count?
FROM?login_log
WHERE?timestamp?>=
AND?timestamp???<=
AND?qita1 =
AND?qita2 = ; 活躍賬號(hào)分析
按照日期分析,常見(jiàn)的DAU/WAU/MAU等 按照渠道分析,比如分包渠道或者廣告渠道等
在線分析
平均在線玩家數(shù) 峰值在線玩家數(shù)
玩家行為分析
人均游戲次數(shù),即所選日期內(nèi),總游戲次數(shù) / 游戲人數(shù)(該數(shù)值無(wú)法完全精確統(tǒng)計(jì),僅供參考) 人均游戲時(shí)長(zhǎng)分析等
2.來(lái)源分析

SELECT?Count(*) AS?count?FROM??
(
????SELECT?deviceid
????FROM?login_log
????WHERE??channel_id = ‘X’
????AND?timestamp?>= ‘XXX’
????AND?timestamp?<= ‘YYY’
????GROUP??BY?deviceid
) AS?d1
????LEFT?JOIN?
(
????SELECT?deviceid
????FROM???login_log
????WHERE??channel_id = ‘X’
????AND?timestamp?< ‘YYY’
) AS?d2
ON?d1.deviceid = d2.deviceid
WHERE??d1.deviceid IS?NULL;3.留存分析

SELECT
??channel_id,
??count(
????DISTINCT?IF?(
??????datediff(payorder_riqi, login_riqi) = 0,
??????user_id,
??????NULL
????)
??) AS?'liucun_1',
??count(
????DISTINCT?IF?(
??????datediff(payorder_riqi, login_riqi) = 1,
??????user_id,
??????NULL
????)
??) AS?'liucun_2',
??count(
????DISTINCT?IF?(
??????datediff(payorder_riqi, login_riqi) = 2,
??????user_id,
??????NULL
????)
??) AS?'liucun_3',
??count(
????DISTINCT?IF?(
??????datediff(payorder_riqi, login_riqi) = 3,
??????user_id,
??????NULL
????)
??) AS?'liucun_4',
??count(
????DISTINCT?IF?(
??????datediff(payorder_riqi, login_riqi) = 4,
??????user_id,
??????NULL
????)
??) AS?'liucun_5',
??count(
????DISTINCT?IF?(
??????datediff(payorder_riqi, login_riqi) = 5,
??????user_id,
??????NULL
????)
??) AS?'liucun_6',
??count(
????DISTINCT?IF?(
??????datediff(payorder_riqi, login_riqi) = 6,
??????user_id,
NULL
????)
??) AS?'liucun_7',
??count(
????DISTINCT?IF?(
??????datediff(payorder_riqi, login_riqi) = 14,
??????user_id,
??????NULL
????)
??) AS?'liucun_15'
FROM
??pay_order p
??LEFT?JOIN?login_log l ON?p.uid = l.uid
WHERE
??payorder_riqi >= '2019-01-17'
??AND?payorder_riqi <= '2019-01-24'
GROUP?BY
??`channel_id`
ORDER?BY
??`liucun_1`?DESC;06? FAQ
SELECT (SUM(data_length)+SUM(index_length))/1024/1024/1024 AS '數(shù)據(jù)空間(GB)' FROM information_schema.tables;用戶還可以使用如下SQL語(yǔ)句查詢當(dāng)前日志占用空間:show binary logs返回結(jié)果中的adb-bin.log表示binlog,adb-system.log表示系統(tǒng)日志。不同的表如果一級(jí)分區(qū)鍵相同,那么這些表在執(zhí)行以一級(jí)分區(qū)鍵為Join Key的JOIN時(shí)可以大幅度減少數(shù)據(jù)Shuffle。因此在保證數(shù)據(jù)均勻的前提下,相同的一級(jí)分區(qū)鍵可以加速JOIN。
ALTER TABLE lineitem PARTITIONS 12表示將lineitem的二級(jí)分區(qū)個(gè)數(shù)修改為12。需要注意的是,二級(jí)分區(qū)個(gè)數(shù)的修改是后臺(tái)異步執(zhí)行的,執(zhí)行BUILD TABLE lineitem可以加速分區(qū)修改任務(wù)。如果查詢一定會(huì)帶有某個(gè)字段,比如電商賣家透視平臺(tái)的賣家id就可以作為聚集索引,保證數(shù)據(jù)的Locality,進(jìn)而讓性能得到量級(jí)的提升。
目前只支持一個(gè)聚集索引,但一個(gè)聚集索引可以包含多列。目前除非對(duì)非常分散的數(shù)據(jù)進(jìn)行點(diǎn)查,否則聚集索引對(duì)性能的幫助很少。
此外需要注意的是,主鍵需要包含一級(jí)分區(qū)鍵和二級(jí)分區(qū)鍵。目前不支持主鍵的修改。
SHOW INDEX FROM tablename。如果想要刪除某個(gè)索引可以使用:ALTER TABLE tablename DROP KEY keyname。其中keyname可以通過(guò)上面的語(yǔ)句查詢。注意:刪除索引可能會(huì)導(dǎo)致查詢變慢。KEY key_name (column_name)。例如:CREATE TABLE tablename (id bigint,c1 varchar,key id_idx(id)) DISTRIBUTE BY HASH(id);。如果DDL中有主鍵,用主鍵作Distribute Key。
如果DDL中沒(méi)有主鍵,會(huì)自動(dòng)創(chuàng)建一個(gè)字段__adb_auto_id__,然后使用__adb_auto_id__作主鍵和分區(qū)鍵。
推薦閱讀

全網(wǎng)首發(fā)|阿里資深技術(shù)專家數(shù)倉(cāng)調(diào)優(yōu)經(jīng)驗(yàn)分享(上)
重磅發(fā)布|云原生數(shù)據(jù)倉(cāng)庫(kù)AnalyticDB技術(shù)架構(gòu)升級(jí),大幅降低存儲(chǔ)成本
點(diǎn)擊“閱讀原文”查看AnalyticDB更多信息
評(píng)論
圖片
表情

