यहां दिए गए सबसे सही तरीकों से, आपको निजता पर आधारित और बेहतर परफ़ॉर्म करने वाली क्वेरी बनाने की तकनीकें मिलेंगी. शोर वाले मोड में क्वेरी चलाने के सबसे सही तरीकों के बारे में जानने के लिए, शोर इंजेक्शन में, काम करने वाले और काम न करने वाले क्वेरी पैटर्न के सेक्शन देखें.
निजता और डेटा की सटीक जानकारी
सैंडबॉक्स डेटा पर क्वेरी बनाना
सबसे सही तरीका: प्रोडक्शन में होने पर ही प्रोडक्शन डेटा की क्वेरी करें.
क्वेरी डेवलप करते समय, जब भी हो सके सैंडबॉक्स डेटा का इस्तेमाल करें. सैंडबॉक्स डेटा का इस्तेमाल करने वाली नौकरियों में, क्वेरी के नतीजों को फ़िल्टर करने के लिए, अंतर की जांच करने के अतिरिक्त अवसर नहीं मिलते. इसके अलावा, निजता जांच न होने की वजह से, सैंडबॉक्स क्वेरी तेज़ी से चलती हैं. इससे क्वेरी बनाने के दौरान, क्वेरी को तेज़ी से दोहराया जा सकता है.
अगर आपको अपने असल डेटा पर क्वेरी बनानी है, तो लाइनें ओवरलैप होने की संभावना कम करने के लिए, तारीख की ऐसी सीमाएं और अन्य पैरामीटर चुनें जो आपकी क्वेरी के हर बार दोहराए जाने पर ओवरलैप न हों. जैसे, मैच टेबल का इस्तेमाल करते समय. आखिर में, अपनी क्वेरी को डेटा की अपनी पसंदीदा रेंज पर चलाएं.
पुराने नतीजों को ध्यान से देखें
सबसे सही तरीका: हाल ही में चलाई गई क्वेरी के बीच, नतीजों के ओवरलैप होने की संभावना कम करें.
ध्यान रखें कि क्वेरी के नतीजों में बदलाव की दर का असर इस बात पर पड़ेगा कि निजता जांच की वजह से, बाद में नतीजों को छिपाने की संभावना कितनी है. हाल ही में मिले नतीजे से मिलता-जुलता दूसरा नतीजा सेट हटाया जा सकता है.
इसके बजाय, अपनी क्वेरी में तारीख की सीमाओं या कैंपेन आईडी जैसे मुख्य पैरामीटर में बदलाव करें, ताकि ओवरलैप होने की संभावना कम हो.
आज के डेटा के लिए क्वेरी न करें
सबसे सही तरीका: खत्म होने की तारीख आज होने पर, एक से ज़्यादा क्वेरी न चलाएं.
खत्म होने की तारीख को आज के तौर पर सेट करके, एक से ज़्यादा क्वेरी चलाने पर, अक्सर पंक्तियां फ़िल्टर हो जाती हैं. यह दिशा-निर्देश, कल के डेटा पर आधी रात के कुछ समय बाद चलने वाली क्वेरी पर भी लागू होता है.
ज़रूरत से ज़्यादा बार एक ही डेटा के लिए क्वेरी न करें
सबसे सही तरीके:
- शुरू और खत्म होने की तारीखें एक-दूसरे से काफ़ी करीब हों.
- ओवरलैप होने वाली विंडो पर क्वेरी करने के बजाय, डेटा के अलग-अलग सेट पर क्वेरी चलाएं. इसके बाद, 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
फ़ील्ड के एक ही सेट के आधार पर इवेंट की गिनती करने वाली क्वेरी को, GROUP 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 पर सेट हो सकता है. जैसे: लोगों की दिलचस्पी के मुताबिक विज्ञापन दिखाने की सुविधा से ऑप्ट आउट करना, कानूनी वजहें वगैरह. इसलिए, कई उपयोगकर्ताओं से मिलने वाला डेटा, user_id
के 0 पर सेट हो जाएगा.
अगर आपको कुल इंप्रेशन या क्लिक जैसे डेटा की कुल संख्या समझनी है, तो आपको ये इवेंट शामिल करने चाहिए. हालांकि, यह डेटा ग्राहकों के बारे में अहम जानकारी पाने के लिए काम का नहीं होगा. अगर आपको इस तरह का विश्लेषण करना है, तो इस डेटा को फ़िल्टर करें.
अपनी क्वेरी में 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): आपकी क्वेरी कितने बाइट पढ़ती है?
- नोड के बीच कम्यूनिकेशन (शफ़लिंग): आपकी क्वेरी अगले चरण में कितने बाइट पास करती है?
- कंप्यूटेशन: आपकी क्वेरी को सीपीयू के कितने काम की ज़रूरत है?
- आउटपुट (मटीरियलाइज़ेशन): आपकी क्वेरी कितने बाइट लिखती है?
- क्वेरी के गलत पैटर्न: क्या आपकी क्वेरी, एसक्यूएल के सबसे सही तरीकों का पालन कर रही हैं?
अगर क्वेरी को लागू करने में, सेवा स्तर समझौते (एसएलए) में तय समय से ज़्यादा लग रहा है या संसाधनों के खत्म होने या टाइम आउट की वजह से गड़बड़ियां आ रही हैं, तो इन बातों का ध्यान रखें:
- फिर से कैलकुलेट करने के बजाय, पिछली क्वेरी के नतीजों का इस्तेमाल करना. उदाहरण के लिए, आपके हफ़्ते का कुल डेटा, BigQuery में एक दिन की सात एग्रीगेट क्वेरी का जोड़ हो सकता है.
- क्वेरी को लॉजिकल सबक्वेरी में बांटना (जैसे, एक से ज़्यादा जॉइन को एक से ज़्यादा क्वेरी में बांटना) या प्रोसेस किए जा रहे डेटा के सेट पर पाबंदी लगाना. BigQuery में, अलग-अलग जॉब के नतीजों को एक डेटासेट में जोड़ा जा सकता है. हालांकि, इससे संसाधनों के खत्म होने की समस्या हल हो सकती है, लेकिन इससे आपकी क्वेरी धीमी हो सकती है.
- अगर आपको BigQuery में संसाधनों की सीमा से ज़्यादा गड़बड़ियां मिल रही हैं, तो अपनी क्वेरी को कई BigQuery क्वेरी में बांटने के लिए, टेम्पररी टेबल का इस्तेमाल करें.
- एक ही क्वेरी में कम टेबल का रेफ़रंस देना, क्योंकि इससे ज़्यादा मेमोरी का इस्तेमाल होता है और आपकी क्वेरी पूरी नहीं हो पाती.
- अपनी क्वेरी को फिर से लिखना, ताकि वे कम उपयोगकर्ता टेबल से जुड़ें.
- अपनी क्वेरी को फिर से लिखना, ताकि एक ही टेबल को फिर से जॉइन न किया जाए.
क्वेरी सलाहकार
अगर आपका एसक्यूएल मान्य है, लेकिन इससे ज़्यादा फ़िल्टरिंग ट्रिगर हो सकती है, तो क्वेरी एडवाइज़र, क्वेरी बनाने की प्रोसेस के दौरान काम की सलाह दिखाता है. इससे आपको ग़लत नतीजों से बचने में मदद मिलती है.
ट्रिगर में ये पैटर्न शामिल हैं:
- एग्रीगेट की गई सबक्वेरी को जॉइन करना
- अलग-अलग उपयोगकर्ताओं के साथ, एग्रीगेट नहीं किए गए डेटा को जॉइन करना
- बार-बार तय की गई अस्थायी टेबल
क्वेरी सलाहकार का इस्तेमाल करने के लिए:
- यूज़र इंटरफ़ेस (यूआई). सुझाव, क्वेरी एडिटर में क्वेरी टेक्स्ट के ऊपर दिखेंगे.
- एपीआई.
customers.analysisQueries.validate
तरीके का इस्तेमाल करें.