विश्लेषणात्मक प्रश्नों का अनुकूलन
1) क्यों अनुकूलित करें (iGaming संदर्भ)
व्यावसायिक गति: GGR/NET रिपोर्ट, प्रदाता/खेल, RG/AML और p95 SLA में विपणन।
लागत: $/अनुरोध के नीचे कम स्कैन किए गए बाइट्स और शाफ्ल -।
विश्वसनीयता: स्थिर पीक आवर्स, कोई बीआई फ्रीज नहीं।
स्केल: दर्जनों ब्रांड/बाजार, अरबों लाइनें, ताजगी के मिनट।
2) लोड प्रोफाइल और एसएलओ
अनुरोधों के "पहले 90%" का वर्णन करें: खिड़कियां (7/28/90 डी), फिल्टर ('ब्रांड, देश, प्रदाता, psp, स्थिति'), शामिल हों, JSON विशेषताएं, शीर्ष K और प्रतिशत।
एसएलओ उदाहरण: p95 ≤ 1। डैशबोर्ड के लिए 2 एस, स्कैन किए गए बाइट्स ≤ 256 एमबी/अनुरोध, ताजगी ≤ 5 मिनट।
3) योजनाओं की शारीरिक रचना: क्या देखना है
भविष्यवाणी/प्रक्षेपण पुशडाउन - फ़िल्टर और स्तंभ सूची को स्रोत पर छोड़ दिया जाता है।
पार्टिशन प्रूनिंग और डेटा स्किपिंग (मिनट-मैक्स/ब्लूम/मैनिफेस्ट)।
सदिश स्कैन/देर से भौतिककरण: स्तंभ JINT/PROJENT द्वारा स्थगित पढ़ ता है।
रणनीति में शामिल हों: ब्रॉडकास्ट हैश (BHJ), सॉर्ट-मर्ज (SMJ), नेस्टेड लूप (NLJ - избегать)।
स्पिल एंड फेरबदल: डिस्क पर फेरबदल और फैलने की मात्रा एसएलए का मुख्य दुश्मन है।
अनुकूली क्वेरी निष्पादन: रनटाइम में रणनीति का परिवर्तन (BHJ↔SMJ स्विचिंग, गतिशील कोयल)।
योजना दिखानी चाहिए: हम कितने बाइट्स पढ़ ते हैं, कहां शाफ्लिम है, हम क्या कैश करते हैं।
4) पार्टियां, छंटाई, समूह मामले
पार्टियां: 'तिथि' + 1-2 एक्सेस आयाम (उदाहरण के लिए, 'ब्रांड, देश')।
सॉर्टिंग/क्लस्टरिंग: 'ऑर्डर बाय/क्लस्टर बाय/जेड-ऑर्डर' अक्सर फ़िल्टर/ज्वाइन ('प्रदाता, game_id, occurred_at')।
पुनर्वर्गीकरण और संघनन: डेटा स्किपिंग के लिए नियमित स्थानांतरण; लक्ष्य फ़ाइल का आकार 128-1024 एमबी है।
5) JINT पैटर्न
ब्रॉडकास्ट हैश ज्वाइन (BHJ): छोटे आयाम ( सैकड़ों MB) - तथ्य के लिए प्रसारित।
sql
/ hint if engine supports/
SELECT /+ BROADCAST(dim_provider) /...
सॉर्ट-मर्ज ज्वाइन (एसएमजे): बड़े सेट, संगत कुंजी छंटाई/क्लस्टर मामलों - न्यूनतम शाफ्ट।
प्री-ज्वाइन/डेनोर्मलाइजेशन: स्थिर विशेषताओं को 'मंद' से वास्तविक स्नैपशॉट (प्रक्षेपण/भौतिक दृश्य) तक ले जाएं - महत्वपूर्ण पथ पर माइनस जेईएन।
एंटी/सेमीजोइन: 'नॉट इन/एक्सिस्ट्स' को स्पष्ट अर्ध-/एंटी-जॉइन योजनाओं में फिर से लिखें।
कार्डिनल विस्फोट का उन्मूलन: आयामों में डुप्लिकेट कुंजियों की जाँच करें, सरोगेट-कुंजियों का उपयोग करें।
6) समूह द्वारा, समुच्चय और पूर्ववर्ती
रोलअप/क्यूब/ग्रुपिंग सेट: कई एकत्रीकरण के बजाय एक चरण।
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));
भौतिक दृश्य (एमवी )/अनुमान: 'भुगतान _ 7d _ by _ brand _ psp', 'राउंड _ 1d _ by _ provider _ game'।
आंशिक → अंतिम एकत्रीकरण: इंजन को श्रमिकों (स्थानीय) और अंत में समन्वयक पर आंशिक रूप से एकत्र करने की अनुमति दें।
अनुमानित: 'COUNT (DISTNT उपयोगकर्ता)' के लिए HLL, प्रतिशत के लिए TDigest - कई सस्ता और BI के लिए पर्याप्त।
7) विंडो फ़ंक्शन (साफ़)
उच्च चयनात्मकता के साथ कुंजियों पर बिल्कुल विभाजन; ऑर्डर बाय - कॉलम सॉर्टिंग द्वारा।
जहां संभव हो भारी खिड़कियों को पूर्वगामी और अर्ध-जुड़ने के साथ बदलें।
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
सीबीओ के लिए फ़िल्टर ऑर्डर महत्वपूर्ण नहीं है, लेकिन चयनात्मकता और सूचकांक/छंटाई हैं।
सीमा... TYES/ACX TOP-K के साथ - स्कैन को छोटा करें।
Pagination: बड़ी तालिकाओं के लिए 'OFFSET/LIMITE' के बजाय 'कुंजी पृष्ठभूमि'।
sql
-- keyset
SELECT FROM t WHERE (date, id) > (:last_date,:last_id) ORDER BY date, id LIMIT 1000;
9) JSON/अर्ध-संरचित
गर्म रास्तों को स्तंभों में भौतिक करें ('युक्ति। ओएस ',' psp। विधि ')।
यदि इंजन समर्थन करता है तो JSON पथ पर उलटा/GIN इंडेक्स का उपयोग करें।
UDF को पंक्ति से बचें: हाइलाइट किए गए गुणों के साथ बेहतर प्रक्षेपण।
10) लगभग और नमूना
HLL/थीटा स्केच: सस्ता 'COUNT DISTENT'।
TDigest/KLL: प्रतिशत p95/p99 बिना पूर्ण प्रकार के।
जलाशय/स्तरीकृत नमूना: संवादात्मक अनुसंधान और पूर्वावलोकन।
11) स्मृति, जलडमरूमध्य और समवर्ती
स्पिल-गार्ड: ज्वाइन/एग पर मेमोरी लिमिट; जब spilling - बैच/समानतावाद को कम करें, कुंजी द्वारा छंटाई बढ़ाएँ।
संगोष्ठी और QoS: "गर्म" डैशबोर्ड और भारी नरक-तदर्थ के लिए पूल; स्कैन/समय सीमा; "भूल" अनुरोधों पर किल-स्विच।
परिणाम कैश/क्वेरी कैश: पुनरावृत्त BI टेम्पलेट के लिए सक्षम, ताज़ा टोकन द्वारा अक्षम।
12) प्रतिगमन परीक्षण और "डबल रन"
शीर्ष एन प्रश्नों के लिए संदर्भ प्रोफाइल (योजना/स्कैन बाइट्स/समय) संग्रहीत करें।
इंडेक्स/क्लस्टर जारी करने से पहले - ए/बी रन: p95, स्कैन किए गए बाइट्स, स्किप्ड शेयर, फेरबदल की तुलना करें।
"फेल-फास्ट" थ्रेसहोल्ड बनाएं: यदि p95 गुलाब> X% - रोलबैक।
13) अवलोकन और एसएलओ
SLI:- p50/p95/p99 विलंबता, स्कैन किए गए बाइट्स/क्वेरी, स्किप्ड बाइट्स%, फाइलें छुई;
- शफल बाइट्स, स्पिल्ड बाइट्स, पीक मेमोरी;
- कैश हिट-रेट; सटीकता दृष्टिकोण-समुच्चय।
अलर्ट: स्कैन किए गए बाइट्स में वृद्धि, स्किप्ड शेयर में गिरावट, अक्सर एनएलजे, स्पिलेज> थ्रेसहोल्ड।
14) आईगेमिंग मामले (व्यंजनों)
14. 1 भुगतान/पीएसपी: "छूट चोटियों"
कहां: 'ts के बीच अब () -7d और अब ()', 'ब्रांड, देश, psp, स्थिति'।
पार्टी: दिन; ऑर्डर/जेड-ऑर्डर: '(ब्रांड, देश, टीएस)'; बिटमैप: 'psp, स्थिति'; खिलना: 'लेनदेन _ id'।
एमवी: 'भुगतान _ 7d _ by _ brand _ psp (स्थिति)'।
परिणाम: p95 → ~ 1s, स्कैन किए गए बाइट्स ↓ 5-10 ×, शून्य जलडमरूमध्य।
14. 2 गेम राउंड: टॉप के गेम्स/ऑवर
ऑर्डर बाय/क्लस्टर по '(प्रदाता, game_id, occurred_at)'; पूर्वग्रह के लिए प्रक्षेपण।
p95 राउंड अवधि के लिए लगभग शीर्ष-K + TDigest।
नीचे की रेखा: गर्म कैश पर उप-दूसरा रेखांकन।
14. 3 आरजी/एएमएल सक्रिय सीमाएं
JSON 'reason' स्तंभ; बिटमैप 'rg _ state', 'kyc _ level'; अंतिम राज्य के साथ अर्ध-जुड़ें।
परिणाम: रिपोर्ट "30 दिनों के लिए" - सेकंड, पूर्ण स्कैन के बिना।
15) अनुकूलन चेकलिस्ट (दैनिक)
1. शीर्ष एन अनुरोधों और उनके प्रोफाइल का संग्रह (योजना/बाइट्स/शाफ़ल)।
2. तारीख + सहमत/क्लस्टर मामलों के अनुसार बैच।
3. पुशडाउन और प्रक्षेपण pruning (केवल आवश्यक स्तंभ) की जाँच की जा रही है।
4. JINT रणनीति: SMJ के लिए छोटा, सॉर्ट प्रसारित, कोई NLJ नहीं।
5. हॉट डैशबोर्ड के लिए प्री-एग्रीगेशन/एमवी।
6. लगभग जहां मान्य (अलग/प्रतिशत/टॉप-के)।
7. JSON → कॉलम और/या उल्टे सूचकांक।
8. संपीड़न/पुनर्वर्गीकरण; स्किप्ड बाइट्स लक्ष्य ≥ 70%।
9. परिणाम कैश और अलग संगोष्ठी पूल।
10. निगरानी: p95, स्कैन किए गए बाइट्स, फेरबदल, स्पिल, हिट-रेट।
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
-- 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 विशिष्ट पुनर्लेखन
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 कीसेट पेगिनेशन
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) एंटी-पैटर्न
'SELECT' in prod; प्रक्षेपण pruning की कमी।
लाखों लाइनों पर OFSET तमाशा।
स्केच के बिना COUNT DISTIT; पूर्ण प्रकार के माध्यम से प्
बड़े सेटों पर एनएलजे; JSON भावों से जुड़ें।
छोटे बैच और बिखरी हुई फ़ाइलें (मेटाडेटा तूफान)।
स्तंभों को भौतिक बनाने के बजाय UDF स्ट्रिंग्स व्हेयर में।
आँकड़े/विश्लेषण अनदेखा करें - अंधा अनुकूलक और पूर्ण स्कैन।
कोई प्रतिगमन परीक्षण और कोई रोलबैक थ्रेसहोल्ड नहीं।
18) कार्यान्वयन रोडमैप
0-30 दिन (एमवीपी)
1. एसएलओ/एसएलआई के शीर्ष एन अनुरोधों और स्थापना का मापन।
2. तारीख + छंटाई/क्लस्टर मामलों द्वारा बैच; डेटा छोड़ ने/खिलने सक्षम करें।
3. गर्म भुगतान रिपोर्ट के अनुसार एक एमवी; HLL/TDigest в BI।
4. स्प्लिट क्वैरी पूल, परिणाम कैश सक्षम करें।
30-90 दिन
1. भारी खिड़कियों की जनगणना/JSON - पूर्ववर्ती/स्तंभ।
2. प्रसारण-छोटे आयामों में शामिल होना; बड़े के लिए एसएमजे; एनएलजे का उन्मूलन।
3. अनुसूची संघनन और पुनर्वर्गीकरण; प्रमुख सलाहकार।
4. अवलोकन और गिरावट की चेतावनी, ए/बी योजना, ऑटो-रोलबैक।
3-6 महीने
1. वर्शनिंग और एसएलए के साथ प्रोजेक्शन/एमवी कैटलॉग।
2. सभी डैशबोर्ड पर अलग/प्रतिशत/टॉप-के के लिए लगभग कर्नेल।
3. प्रतिगमन परीक्षण और बजट $/अनुरोध के लिए एक समान टेम्पलेट।
4. JSON और UDF स्थायी स्वच्छता: भौतिककरण और सूचकांक।
19) RACI
डेटा प्लेटफ़ॉर्म (आर): विभाजन/क्लस्टरिंग/संपीड़न, एमवी/अनुमान, कैश, निगरानी।
एनालिटिक्स/बीआई (आर): एसक्यूएल पुनर्लेखन, लगभग समुच्चय, प्रतिगमन परीक्षण।
डोमेन ओनर्स (C): अनुभागों और सटीकता के लिए आवश्यकताएं।
सुरक्षा/डीपीओ (ए/आर): गोपनीयता/पीआईआई, समुच्चय की के-गुमनामी।
SRE/ऑब्जर्वेबिलिटी (C): SLO/अलर्टिंग, संगति और क्षमता।
वित्त (C): $/अनुरोध और आर्थिक प्रभाव के लिए बजट।
20) संबंधित अनुभाग
विश्लेषणात्मक भंडारण अनुक्रमण, डेटा स्कीमा और विकास, डेटा सत्यापन, डेटा क्लस्टरिंग, आयाम कटौती, विश्लेषण और मेट्रिक्स एपीआई, एमएलओपी: मॉडल शोषण।
कुल
क्वेरी अनुकूलन एक "जादू संकेत" नहीं है, बल्कि एक प्रणाली है: सक्षम डेटा मार्कअप (विभाजन/समूह), पूर्ववर्ती और अनुमानित एल्गोरिदम, सही जेईएन रणनीति, कैश/कॉन्सरेंसी और पी 95 और स्कैन किए गए बाइट्स। IGaming के लिए, इसका मतलब है भुगतान, खेल और अनुपालन के लिए तेज और स्थिर मैट्रिक्स - SLA और बजट के भीतर।