यहां दिए गए सबसे सही तरीकों से, आपको निजता को ध्यान में रखकर और बेहतर परफ़ॉर्म करने वाली क्वेरी बनाने की तकनीकें मिलेंगी.
निजता और डेटा कितना सटीक है
सैंडबॉक्स डेटा के बारे में क्वेरी तैयार करना
सबसे सही तरीका: प्रोडक्शन में मौजूद डेटा को ही क्वेरी करें.
जब भी मुमकिन हो, क्वेरी बनाते समय सैंडबॉक्स डेटा का इस्तेमाल करें. सैंडबॉक्स डेटा का इस्तेमाल करने वाली नौकरियों में, आपको क्वेरी के नतीजों को फ़िल्टर करने के लिए अंतर की जांच करने के अतिरिक्त अवसर नहीं मिलते. इसके अलावा, निजता जांच की कमी की वजह से, सैंडबॉक्स क्वेरी तेज़ी से काम करती हैं. इससे क्वेरी डेवलपमेंट के दौरान, इन्हें तेज़ी से दोहराया जाता है.
अगर आपको अपने असल डेटा पर क्वेरी बनानी हैं (जैसे, मैच टेबल का इस्तेमाल करते समय), तो लाइनों के ओवरलैप होने की संभावना कम हो जाए, तो तारीख की सीमाएं और ऐसे दूसरे पैरामीटर चुनें जिनके आपकी क्वेरी के हर बार होने की संभावना के ओवरलैप होने की संभावना नहीं होती. आखिर में, अपनी क्वेरी को डेटा की मनमुताबिक रेंज पर चलाएं.
ऐतिहासिक नतीजों पर सावधानी से विचार करें
सबसे सही तरीका: हाल ही में की गई क्वेरी के बीच, नतीजों के सेट के ओवरलैप होने की संभावना कम करें.
ध्यान रखें कि क्वेरी के नतीजों के बीच बदलाव की दर इस बात पर असर डालेगी कि इस बात की कितनी संभावना है कि निजता जांच की वजह से नतीजों को बाद में हटा दिया जाए. हो सकता है कि दूसरे नतीजे का सेट, जो हाल ही में लौटाए गए नतीजे के सेट से काफ़ी मिलता-जुलता हो.
इसके बजाय, अपनी क्वेरी में तारीख की सीमा या कैंपेन आईडी जैसे मुख्य पैरामीटर में बदलाव करें, ताकि ओवरलैप होने की संभावना कम हो जाए.
आज के डेटा के लिए क्वेरी न करें
सबसे सही तरीका: ऐसी एक से ज़्यादा क्वेरी न चलाएं जिनके खत्म होने की तारीख आज है.
अगर ऐसी कई क्वेरी की जाती हैं जिनके खत्म होने की तारीख, आज के बराबर है, तो अक्सर पंक्तियां फ़िल्टर की जाएंगी. यह दिशा-निर्देश कल के डेटा में आधी रात के तुरंत बाद चल रही क्वेरी पर भी लागू होता है.
एक ही डेटा के लिए ज़रूरत से ज़्यादा क्वेरी न करें
सबसे सही तरीके:
- शुरू और खत्म होने की तारीखों को एक साथ चुनें.
- ओवरलैप होने वाली विंडो से क्वेरी करने के बजाय, डेटा के अलग-अलग सेट पर अपनी क्वेरी चलाएं, फिर नतीजों को BigQuery में एग्रीगेट करें.
- अपनी क्वेरी को फिर से चलाने के बजाय, सेव किए गए नतीजों का इस्तेमाल करें.
- तारीख की जिस सीमा के लिए क्वेरी की जा रही है उसके लिए अस्थायी टेबल बनाएं.
Ads Data Hub यह तय करता है कि एक ही डेटा को कितनी बार खोजा जा सकता है. इसलिए, आपको कोशिश करनी चाहिए कि इस डेटा को सीमित तौर पर ऐक्सेस किया जाए.
एक ही क्वेरी में ज़रूरत से ज़्यादा एग्रीगेशन का इस्तेमाल न करें
सबसे सही तरीके:
- किसी क्वेरी में एग्रीगेशन की संख्या को कम से कम करें
- अगर हो सके, तो एग्रीगेशन को जोड़ने के लिए क्वेरी को फिर से लिखें
Ads Data Hub, किसी सबक्वेरी में इस्तेमाल किए जा सकने वाले क्रॉस-यूज़र एग्रीगेशन की संख्या को 100 तक सीमित कर देता है. इसलिए, हम कुल मिलाकर ऐसी क्वेरी लिखने का सुझाव देते हैं जिनमें फ़ोकस किए गए ग्रुप की कुंजियों और आसान एग्रीगेशन के साथ ज़्यादा पंक्तियां हों और बड़े ग्रुपिंग कुंजियों और जटिल एग्रीगेशन वाले कॉलम की जगह ज़्यादा पंक्तियां हों. नीचे दिए गए पैटर्न से बचना चाहिए:
SELECT
COUNTIF(field_1 = a_1 AND field_2 = b_1) AS cnt_1,
COUNTIF(field_1 = a_2 AND field_2 = b_2) AS cnt_2
FROM
table
फ़ील्ड के एक ही सेट के आधार पर इवेंट की गिनती करने वाली क्वेरी को ग्रुप BY स्टेटमेंट का इस्तेमाल करके फिर से लिखा जाना चाहिए.
SELECT
field_1,
field_2,
COUNT(1) AS cnt
FROM
table
GROUP BY
1, 2
BigQuery में, नतीजों को एक ही तरह से एग्रीगेट किया जा सकता है.
ऐसी क्वेरी जो किसी कलेक्शन से कॉलम बनाती हैं और फिर उन्हें इकट्ठा करती हैं, तो उन्हें इन चरणों को मर्ज करने के लिए फिर से लिखा जाना चाहिए.
SELECT
COUNTIF(a_1) AS cnt_1,
COUNTIF(a_2) AS cnt_2
FROM
(SELECT
1 IN UNNEST(field) AS a_1,
2 IN UNNEST(field) AS a_2,
FROM
table)
पिछली क्वेरी को इस तरह से फिर से लिखा जा सकता है:
SELECT f, COUNT(1) FROM table, UNNEST(field) AS f GROUP BY 1
अलग-अलग एग्रीगेशन में, फ़ील्ड के अलग-अलग कॉम्बिनेशन का इस्तेमाल करने वाली क्वेरी को कई मुख्य क्वेरी में फिर से लिखा जा सकता है.
SELECT
COUNTIF(field_1 = a_1) AS cnt_a_1,
COUNTIF(field_1 = b_1) AS cnt_b_1,
COUNTIF(field_2 = a_2) AS cnt_a_2,
COUNTIF(field_2 = b_2) AS cnt_b_2,
FROM table
पिछली क्वेरी को इसमें बांटा जा सकता है:
SELECT
field_1, COUNT(*) AS cnt
FROM table
GROUP BY 1
और
SELECT
field_2, COUNT(*) AS cnt
FROM table
GROUP BY 1
इन नतीजों को अलग-अलग क्वेरी में बांटा जा सकता है, किसी एक क्वेरी में टेबल बनाई जा सकती हैं और उनमें शामिल किया जा सकता है. इसके अलावा, स्कीमा के साथ काम करने पर उन्हें UNION से जोड़ा जा सकता है.
जॉइन को ऑप्टिमाइज़ करना और उनके बारे में समझना
सबसे सही तरीका: क्लिक या कन्वर्ज़न को इंप्रेशन में जोड़ने के लिए, INNER JOIN
के बजाय LEFT JOIN
का इस्तेमाल करें.
सभी इंप्रेशन, क्लिक या कन्वर्ज़न से नहीं जुड़े होते हैं. इसलिए, अगर आपने इंप्रेशन पर INNER JOIN
क्लिक या कन्वर्ज़न किया है, तो ऐसे इंप्रेशन जो क्लिक या कन्वर्ज़न से नहीं जुड़े हैं वे आपके नतीजों से फ़िल्टर किए जाएंगे.
BigQuery में कुछ फ़ाइनल नतीजों में शामिल हों
सबसे सही तरीका: एग्रीगेट किए गए नतीजों में शामिल होने वाली Ads Data Hub की क्वेरी से बचें. इसके बजाय, दो अलग-अलग क्वेरी लिखें और BigQuery के नतीजों में शामिल हों.
एग्रीगेशन की ज़रूरी शर्तें पूरी नहीं करने वाली लाइनें, आपके नतीजों से फ़िल्टर कर दी जाती हैं. इसलिए, अगर आपकी क्वेरी पर्याप्त रूप से एग्रीगेट की गई लाइन के साथ ज़रूरत के मुताबिक एग्रीगेट नहीं की गई लाइन से जुड़ जाती है, तो नतीजे वाली लाइन को फ़िल्टर कर दिया जाएगा. इसके अलावा, Ads Data Hub में एक से ज़्यादा एग्रीगेशन वाली क्वेरी कम परफ़ॉर्म करती हैं.
Ads Data Hub से, कई एग्रीगेशन क्वेरी के ज़रिए नतीजों में शामिल (BigQuery में) किया जा सकता है. सामान्य क्वेरी का इस्तेमाल करके जिन नतीजों का आकलन किया जाता है वे फ़ाइनल स्कीमा शेयर करेंगे.
नीचे दी गई क्वेरी, Ads Data Hub के अलग-अलग नतीजे (campaign_data_123
और campaign_data_456
) लेकर, उन्हें BigQuery में जोड़ती है:
SELECT t1.campaign_id, t1.city, t1.X, t2.Y
FROM `campaign_data_123` AS t1
FULL JOIN `campaign_data_456` AS t2
USING (campaign_id, city)
फ़िल्टर की गई पंक्ति के बारे में खास जानकारी का इस्तेमाल करें
सबसे सही तरीका: अपनी क्वेरी में, फ़िल्टर की गई लाइनों के बारे में खास जानकारी जोड़ें.
फ़िल्टर की गई पंक्तियों की खास जानकारी से उस डेटा का मिलान होता है जिसे निजता से जुड़ी जांच की वजह से फ़िल्टर किया गया था. फ़िल्टर की गई पंक्तियों के डेटा को एक साथ जोड़ा जाता है और उसे कैच-ऑल पंक्ति में जोड़ा जाता है. हालांकि, फ़िल्टर किए गए डेटा का और विश्लेषण नहीं किया जा सकता, लेकिन इससे यह पता चलता है कि नतीजों से कितना डेटा फ़िल्टर किया गया.
शून्य किए गए यूज़र आईडी के लिए खाता
सबसे सही तरीका: अपने नतीजों में, शून्य यूज़र आईडी को ध्यान में रखें.
किसी असली उपयोगकर्ता के आईडी को 0 पर सेट करने की कई वजहें हो सकती हैं. जैसे: दिलचस्पी के मुताबिक विज्ञापन दिखाने से ऑप्ट आउट करना, कानूनी वजहें वगैरह. कई उपयोगकर्ताओं से मिलने वाले डेटा को 0 के user_id
पर सेट किया जाएगा.
अगर आपको कुल इंप्रेशन या क्लिक जैसे डेटा की कुल संख्या को समझना है, तो आपको इन इवेंट को शामिल करना चाहिए. हालांकि, ग्राहक के बारे में अहम जानकारी पाने के लिए यह डेटा उपयोगी नहीं होगा. अगर ऐसा विश्लेषण किया जा रहा है, तो उसे फ़िल्टर करना चाहिए.
अपनी क्वेरी में WHERE user_id != "0"
जोड़कर, इस डेटा को अपने नतीजों से बाहर रखा जा सकता है.
परफ़ॉर्मेंस
फिर से एग्रीगेट करने से बचें
सबसे सही तरीका: उपयोगकर्ताओं के लिए, एग्रीगेशन की एक से ज़्यादा लेयर का इस्तेमाल करने से बचें.
जिन क्वेरी में पहले से इकट्ठा किए गए नतीजे शामिल होते हैं उन्हें प्रोसेस करने के लिए ज़्यादा संसाधनों की ज़रूरत होती है. ऐसा एक से ज़्यादा GROUP BY
वाली क्वेरी या नेस्ट किए गए एग्रीगेशन वाली क्वेरी के मामले में होता है.
अक्सर, एग्रीगेशन की कई लेयर वाली क्वेरी को बांटा जा सकता है. इससे परफ़ॉर्मेंस बेहतर होती है. प्रोसेस करते समय, आपको इवेंट या उपयोगकर्ता के लेवल पर लाइनें रखने की कोशिश करनी चाहिए. इसके बाद, इन्हें एक एग्रीगेशन के साथ जोड़ना चाहिए.
नीचे दिए गए पैटर्न का इस्तेमाल नहीं किया जाना चाहिए:
SELECT SUM(count)
FROM
(SELECT campaign_id, COUNT(0) AS count FROM ... GROUP BY 1)
एग्रीगेशन की कई लेयर का इस्तेमाल करने वाली क्वेरी को फिर से लिखना चाहिए, ताकि एग्रीगेशन की एक लेयर का इस्तेमाल किया जा सके.
(SELECT ... GROUP BY ... )
JOIN USING (...)
(SELECT ... GROUP BY ... )
जिन क्वेरी को आसानी से बांटा जा सकता है उन्हें अलग-अलग करना चाहिए. BigQuery में ही नतीजों को शामिल किया जा सकता है.
BigQuery के लिए ऑप्टिमाइज़ करें
आम तौर पर, कम परफ़ॉर्म करने वाली क्वेरी बेहतर परफ़ॉर्म करती हैं. क्वेरी की परफ़ॉर्मेंस का आकलन करते समय, आपको कितना काम करना होगा, यह इन बातों पर निर्भर करता है:
- इनपुट और डेटा सोर्स (I/O): आपकी क्वेरी कितने बाइट पढ़ती है?
- नोड के बीच कम्यूनिकेशन (शफ़लिंग): अगले चरण में आपकी क्वेरी कितने बाइट पास करती है?
- कंप्यूटेशन: आपकी क्वेरी के लिए कितने सीपीयू (CPU) का इस्तेमाल करना ज़रूरी है?
- आउटपुट (मटीरियलाइज़ेशन): आपकी क्वेरी कितने बाइट लिखती है?
- क्वेरी के एंटी-पैटर्न: क्या आपकी क्वेरी, एसक्यूएल के सबसे सही तरीकों के मुताबिक हैं?
अगर क्वेरी का निष्पादन आपके सेवा स्तर समझौते के मुताबिक नहीं हो रहा है या आपको संसाधन खत्म होने या टाइम आउट होने की वजह से गड़बड़ियों का सामना करना पड़ रहा है, तो इन बातों को ध्यान में रखें:
- फिर से कंप्यूट करने के बजाय पिछली क्वेरी के नतीजों का इस्तेमाल करना. उदाहरण के लिए, आपकी साप्ताहिक कुल 7 एक दिन की कुल क्वेरी के BigQuery में गणना किया गया योग हो सकता है.
- क्वेरी को लॉजिकल सबक्वेरी में बांटना (जैसे कि एक से ज़्यादा जॉइन को एक से ज़्यादा क्वेरी में बांटना) या प्रोसेस किए जा रहे डेटा के सेट को सीमित करना. BigQuery में, अलग-अलग जॉब के नतीजों को एक ही डेटासेट में मिलाया जा सकता है. हालांकि, इससे संसाधन खत्म होने में मदद मिल सकती है, लेकिन यह आपकी क्वेरी को धीमा कर सकता है.
- अगर आपको BigQuery में मिले रिसॉर्स से जुड़ी गड़बड़ियों का सामना करना पड़ रहा है, तो अपनी क्वेरी को एक से ज़्यादा BigQuery क्वेरी में बांटने के लिए अस्थायी टेबल का इस्तेमाल करें.
- किसी क्वेरी में कम टेबल का रेफ़रंस देना, क्योंकि इसमें ज़्यादा मेमोरी का इस्तेमाल होता है और आपकी क्वेरी फ़ेल हो सकती है.
- अपनी क्वेरी को इस तरह दोबारा लिखें कि वे कम उपयोगकर्ता टेबल में शामिल हो जाएं.
- अपनी क्वेरी को फिर से लिखें, ताकि एक ही टेबल को दोबारा उसी टेबल में शामिल होने से रोका जा सके.
क्वेरी सलाहकार
अगर आपका एसक्यूएल मान्य है, लेकिन बहुत ज़्यादा फ़िल्टर करने की सुविधा ट्रिगर हो सकती है, तो क्वेरी बनाने के दौरान क्वेरी सलाहकार, काम की सलाह देता है. इससे आपको अनचाहे नतीजों से बचने में मदद मिलती है.
ट्रिगर में ये पैटर्न शामिल हैं:
- एग्रीगेट की गई सबक्वेरी में शामिल होना
- एग्रीगेट नहीं किए गए डेटा को अलग-अलग उपयोगकर्ताओं के साथ जोड़ना
- बार-बार तय की गई अस्थायी टेबल
क्वेरी सलाहकार का इस्तेमाल करने के लिए:
- यूज़र इंटरफ़ेस (यूआई). सुझाव, क्वेरी एडिटर में क्वेरी टेक्स्ट के ऊपर दिखेंगे.
- API.
customers.analysisQueries.validate
वाला तरीका इस्तेमाल करें.