Վերլուծական հարցումների օպտիմիզացումը
1) Ինչու՞ օպտիմիզացնել (iGaming ենթատեքստը)
Բիզնես արագությունը 'GGR/NET, պրովայդերներ/խաղեր, RG/AML և մարքեթինգը p95 SLA-ում։
Արժեքը 'ավելի քիչ սկանավորված բայթ և շաֆլան ավելի ցածր է, քան դոլարը/հարցումը։
Մոսկվա 'կայուն պիկ ժամացույց, BI «սառեցման» բացակայություն։
Մասշտաբը 'տասնյակ բրենդեր/շուկաներ, միլիարդավոր տողեր, թարմության րոպե։
2) Բեռի և SLO-ի պրոֆիլը
Գրեք հարցումների «առաջին 90 տոկոսը» 'պատուհանները (7/28/90d), ֆիլտրերը («brand, country, provider, provider, pro, status»), Join' a, JSON ատրիբուտները, լավագույն K-ը և փետուրները։
SLO օրինակներ ՝ p95 241։ 2 s dashbord, scanned bytes 24256 MV/հարցում, freshness 245 min։
3) Ծրագրերի անատոմիա 'ինչ փնտրել
Disdicate/Project pushdown: Ֆիլտրերը և սյուների ցանկը իջնում են աղբյուրին։
Parterpruning & www.skiping: ավելցուկ կուսակցությունների/ֆայլերի (min-max/bloom/manifest)։
Vectorized scan/late materialization: Կարդացեք JOIN/PROJC-ի հետաձգված սյուների վրա։
Join strategy: Broadcast Hash (BHJ), Sort-Merge (SMJ), Nested Loop (NLJ — избегать).
Spill & shuffle: Discove-ը SLA-ի գլխավոր թշնամին է։
Adaptive query execution: ռազմավարության փոփոխությունը rantaime-ում (BHJ-ի տեղափոխումը SMJ, դինամիկ կոալեսը)։
Պլանը պետք է ցույց տա, թե որքան բայթ ենք կարդում, որտեղ շաֆլիմ ենք կարդում, որ քեշիրուն ենք։
4) Կուսակցություն, տեսակավորում, կլաստեր-քեյս
Կուսակցությունը 'հասանելիության չափման "date' + 1-2 (օրինակ ՝" brand, country ")։
Տեսակավորումը/կլաստերիզացիան '«ORDER BY/CLUSTER BY/Z-order» հաճախակի ֆիլտրերով/ջոնամներով («provider, game _ id, occurred _ at»)։
Գովազդի ստերիզացիա և կոմպակտացիա 'ստացիոնար փոխանցումը ռուսական skipping-ի համար։ 210-1024 ՄԲ ֆայլերի չափսը։
5) JOIN-pattern-ը
Broadcations Hash Join (BHJ) 'փոքրիկ չափումը (4900 ՄԲ) broadcript փաստին։
sql
/ hint if engine supports/
SELECT /+ BROADCAST(dim_provider) /...
Soft-Merge Join (SMJ) 'մեծ հավաքածուներ, որոնք համատեղելի են հիմնական տեսակավորումը/կլաստեր-քեյսը նվազագույն շաֆլ է։
Pre-join/denorizalization: Վերցրեք կայուն ատրիբուտներ '«dection _» -ից փաստի մեջ (project/materialized) - minus JOIN-ը կրիտիկական ուղու վրա։
Anti/semijoins: Գրեք 'MST IN/EXISSA-ը ակնհայտ semi-/anti-join ծրագրերում։
Կարդինալ պայթյունի իրականացումը 'ստուգեք կրկնօրինակները չափումների մեջ, օգտագործեք surrogate-keys։
6) GROUGE BY, ագրեգատներ և նախազգուշացում
Rollup/Cube/Winuping Sets: Մեկ փուլ մի քանի ագրեգատների փոխարեն։
sql
SELECT brand, country, DATE(ts) d, SUM(amount)
FROM gold. payments
WHERE ts >= NOW() - INTERVAL '7 days'
GROUP BY GROUPING SETS ((brand,country,d),(brand,d),(d));
Նյութականացված ներկայացումները (MV )/պրոյեկտները ՝ «payments _ 7d _ by _ by _ port», «rounds _ 1d _ by _ provider _ game»։
Partial medical Final aggregation: Թույլ տվեք շարժիչը միաձուլել մասամբ վորկերների վրա (ental) և վերջնական կոորդինատորի վրա։
Approximate: HMS-ը 'COUNT-ի համար (DISTINCT user), TDigest-ը պերցենտիլների համար շատ ավելի էժան է և բավարար է BI-ի համար։
7) Պատուհանի գործառույթները (ուշադիր)
PARTIM BY-ն հավասար է բարձր ընտրության բաների։ ORDER BY-ը հսկայական տեսակավորման մեջ է։
Փոխարինեք ծանր պատուհանները նախնական և semi-joins, որտեղ հնարավոր է։
sql
-- Instead of window distinct
SELECT brand, COUNT() users
FROM (SELECT DISTINCT brand, user_id FROM gold. sessions WHERE d>=CURRENT_DATE-7) t
GROUP BY brand;
8) Ֆիլտրեր, պագինացիա և TOP-K
Ֆիլտրերի կարգը կարևոր չէ CBO-ի համար, բայց կարևոր է ընտրության և ինդեքսների/տեսակավորման համար։
LIMIT … WITH TIES/APROX TOP-K-ն կրճատում է սկանը։
Պագինացիա '"keyset pagination" փոխարեն' MSSET/LIMIT "մեծ աղյուսակների համար։
sql
-- keyset
SELECT FROM t WHERE (date, id) > (:last_date,:last_id) ORDER BY date, id LIMIT 1000;
9) JSON/կես կառուցվածք ունեցող
Նյութականացրեք տաք ճանապարհները սյունակներում ("device. os`, `psp. method`).
Օգտագործեք օգտագործված ինդեքսները/GIN-ը JSON հետքերով, եթե շարժիչը աջակցում է։
Խուսափեք UDF-ից 'ավելի լավ պրոյեկցիաներ, որոնք ունեն ատրիբուտներ։
10) Approx-ը և semprox-ը
HMS/Theta Sketch: Էժան «COUNT DISTINCT»։
TDigest/KMS: p95/p99-ը առանց frons.ru։
Reservoir/stratified sampling: ինտերակտիվ ուսումնասիրություններ և գերազանցություն։
11) Հիշողություն, հիշողություն և concarrency
Spill-guard: Հիշողության սահմանափակումներ join/agg; նեղուցի դեպքում նվազեցրեք batch/parallelism, ավելացրեք տեսակավորումը։
Concurrency & QoS 'puls «տաք» dashbords և ծանր ad-hoc; լիմիտներ սկան/ժամանակ; kill-switch-ը «մոռացված» հարցումների վրա։
Resportcache/query cache: Միացրեք BI ձևանմուշները կրկնելու համար, հաշմանդամ եղեք թարմ հոսքի միջոցով։
12) Ռեգրեսիայի թեստերը և կրկնակի պրոթոնը
Պահպանեք ստանդարտ պրոֆիլները (պլան/սկան-բայթ/ժամանակ) առաջին N հարցումների համար։
Ինդեքսների/կլաստերների թողարկումից առաջ 'A/B-progon: Համեմատեք p95, scanned bytes, skipped to, shuffle։
Դարձրեք «fail-fox» շեմը 'եթե p95 մեծացել է> X տոկոսը' արձագանք։
13) Դիտարկումը և SLO-ն
SLI:- p50/p95/p99 latency, scanned bytes/query, skipped bytes %, files touched;
- shuffle bytes, spilled bytes, peak memory;
- cache hit-rate; Approx ագրեգատների acuracy aprox։
Alerta: Scanned bytes աճը, skipped-ի նվազումը, NLJ-ի հաճախակի, 24> շեմն է։
14) Քեյսա iGaming (բաղադրատոմսեր)
14. 1 Վճարումներ/PSA: «Մերժումների պիկի»
WHERE: `ts BETWEEN now()-7d AND now()`, `brand,country,psp,status`.
Կուսակցություն ՝ day; ORDER/Z-order: `(brand,country,ts)`; bitmap: `psp,status`; bloom: `transaction_id`.
MV: `payments_7d_by_brand_psp(status)`.
Արդյունքը ՝ p95 241s, scanned bytes-ը 5-10 ռուբլիներ, զրոյական։
14. 2 Խաղային փուլեր ՝ առաջին K խաղեր/ժամ
ORDER BY / cluster по `(provider, game_id, occurred_at)`; project նախաագրեգատների համար։
Approx Top-K + TDigest-ը p95 տևողության համար։
Արդյունքը '2019 վայրկյան գրաֆիկները տաք քեշի վրա։
14. 3 RG/AML ՝ ակտիվ սահմանափակումներ
JSON 'reason' ռուսական սյունակ; bitmap `rg_state`, `kyc_level`; semi-join վերջին վիճակով։
Արդյունքը '«30 օրվա ընթացքում» զեկույցը վայրկյաններ է, առանց fronscan։
15) Օպտիմիզացման թուղթ (ամենօրյա)
1. Լավագույն N հարցումների հավաքումը և դրանց իրականացումը (պլան/բայթ/շաֆլ)։
2. Կուսակցությունները + աշխատանքային տեսակավորում/կլաստեր-կետեր։
3. Pushdown և project pruning (միայն անհրաժեշտ սյուները)։
4. JOIN ռազմավարություն 'broadcript փոքր, SMJ-ի համար տեսակավորում, չկա NLJ։
5. Նախածննդյան/MV տաք dashbords համար։
6. Approx-ը այնտեղ, որտեղ թույլատրելի է (distinct/percentiles/top-k)։
7. JSON-ը պարունակում է սյուներ և/կամ ինովացված ինդեքսներ։
8. Կոմպակտիա/գովազդացում; skipped bytes-ի նպատակը 70 տոկոսն է։
9. Քեշը արդյունքները և առանձին շուլերը concarrenci։
10. J: p95, scanned bytes, shuffle, spill, hit-rate։
16) Ձևանմուշները (պատրաստ են օգտագործման համար)
16. 1 Օպտիմիզացման քաղաքականություն (YAML)
yaml workload: bi_hot slo:
p95_latency_ms: 1200 scanned_bytes_max_mb: 256 skipped_bytes_share_min: 0. 70 storage:
partition_by: ["date"]
cluster_by: ["brand","country","occurred_at"]
indexes:
bloom: ["transaction_id","user_surrogate_id"]
bitmap: ["psp","status","rg_state"]
aggregation:
mv:
- name: mv_payments_7d_brand_psp window: "7d"
group_by: ["brand","psp","status"]
approx:
count_distinct: "hll"
percentile: "tdigest"
concurrency:
pools: {bi_hot: 50, adhoc: 10}
timeout_s: 120
16. 2 Հարցման ռեգրեսիայի թեստ (կեղծ-SQL)
sql
-- baseline: p95<=1200ms, scanned_bytes<=256MB
EXPLAIN ANALYZE
SELECT brand, psp, status, COUNT() cnt, SUM(amount) amt
FROM gold. payments
WHERE ts >= NOW() - INTERVAL '7 days'
AND brand =:brand AND country =:country
GROUP BY brand, psp, status;
16. 3 DISTINCT
sql
-- Bad: Heavy COUNT (DISTINCT user_id)
SELECT COUNT(DISTINCT user_id) FROM gold. sessions WHERE d>=CURRENT_DATE-7;
-- Better: HLL sketch/preaggregate
SELECT hll_union(user_hll) FROM agg. sessions_7d_user_hll WHERE d>=CURRENT_DATE-7;
16. 4 Keyset-pagination
sql
SELECT
FROM gold. game_rounds
WHERE (occurred_at, round_id) > (:ts,:rid)
AND brand=:brand AND country=:country
ORDER BY occurred_at, round_id
LIMIT 1000;
17) Anti-patterna
«III III» վաճառքում; projpruning բացակայությունը։
MSSET-ը միլիոնավոր տողերի վրա։
COUNT DISTINCT առանց ձողերի; համարեցին ամբողջական som։
NLJ մեծ հավաքածուներում։ JSON արտահայտություններով։
Փոքր կուսակցություններ և ցրված ֆայլեր (մետատվյալների փոթորիկ)։
UDF տողերը WHLS-ում 'կոլոնների նյութականացման փոխարեն։
Վիճակագրությունը/ANMS ZE-ը կույր օպտիմիզատոր է և fronscan։
Ռեգրեսիայի թեստերի և արձագանքի շեմերի բացակայությունը։
18) Իրականացման ճանապարհային քարտեզը
0-30 օր (MVP)
1. Zamer-N հարցումները և SLO/SLI տեղադրումը։
2. Կուսակցությունները + տեսակավորում/կլաստեր-քեյսներ; միացրեք wwww.skipping/bloom։
3. Մեկ MV-ը «տաք» զեկույցի վրա։ HLL/TDigest в BI.
4. Հարցումների փամփուշտների բաժանումը, որը տեղադրված է resortcache-ում։
30-90 օր
1. Ծանր պատուհանների ձայնագրությունը/JSON-ը կանխատեսում/սյունակներ։
2. Broadcast-join փոքր կղզիներ; SMJ մեծերի համար; NLJ։
3. Կոմպոզիցիան և գովազդումը ժամանակացույցով։ ավտոմեքենաների փոխադրողը։
4. Դեգրադացիայի, A/B պլանների, աուտո-ռեպատի դիտարկումը և ալերտները։
3-6 ամիս
1. Պրոյեկցիաների/MV-ի կատալոգը տարբերակման և SLA-ի հետ։
2. Approx-միջուկը distinct/percentile/top-k-ի համար բոլոր dashbords-ի համար։
3. Ռեֆլեքսային թեստերի միասնական ձևանմուշները և $/հարցումը։
4. JSON-ի և UDF-ի մշտական հիգիենան 'նյութականացում և ինդեքսներ։
19) RACI
SystePlatform (R) 'կուսակցություն/կլաստերիզացիա/կոմպակտացիա, MV/պրոյեկցիա, քեշներ, ռուսական։
Antrox/BI (R) 'SQL, approx ագրեգատներ, ռեգրեսիայի թեստեր։
Domain Owners (C) 'կտրվածքների և ճշգրտության պահանջներ։
System/DPO (A/R) 'մասնավորություն/PII, k-անանուն ագրեգատների։
MSE/Observability (C): SLO/alerting, concarency և capasity։
Finance (C) 'բյուջեներ դոլար/հարցում և տնտեսական ազդեցություն։
20) Կապված հատվածներ
Վերլուծական պահեստների ինդեքսավորումը, Տվյալների սխեմաները և դրանց էվոլյուցիան, Տվյալների Valivation, Intel Ops պրակտիկան, տվյալների կլաստերիզացիան, Չափման նվազումը, API վերլուծաբանները և մետրիկը, MLOps-ը 'մոդելների շահագործումը։
Արդյունքը
Հարցումների օպտիմիզացումը ոչ թե «կախարդական հինթ» է, այլ համակարգը 'տվյալների գրագետ գծանշում (կուսակցություն), նախածննդյան և approximate ալգորիթմներ, ճիշտ JOIN ռազմավարություն, քեշ/concarrency և մշտական p95 և scanned bytes։ IGaming-ի համար դա նշանակում է արագ և կայուն վճարումներ, խաղեր և կոմպլանսներ 'SLA-ի և բյուջեի շրջանակներում։