ठीक है, आपके दोनों प्रश्न अलग-अलग तालिकाओं पर हैं (reportimpression
बनाम रिपोर्ट इंप्रेशन दिवस
), इसलिए दो प्रश्नों की तुलना वास्तव में तुलना नहीं है। क्या आपने विश्लेषण किया
दोनों? विभिन्न स्तंभ आँकड़े भी एक भूमिका निभा सकते हैं। इंडेक्स या टेबल ब्लोट अलग हो सकता है। क्या सभी पंक्तियों का एक बड़ा हिस्सा फरवरी 2019 के लिए योग्य है? आदि।
अंधेरे में एक शॉट, दोनों तालिकाओं के प्रतिशत की तुलना करें:
SELECT tbl, round(share * 100 / total, 2) As percentage
FROM (
SELECT text 'reportimpression' AS tbl
, count(*)::numeric AS total
, count(*) FILTER (WHERE datelocal >= '2019-02-01' AND datelocal < '2019-03-01')::numeric AS share
FROM reportimpression
UNION ALL
SELECT 'reportimpressionday'
, count(*)
, count(*) FILTER (WHERE datelocal >= '2019-02-01' AND datelocal < '2019-03-01')
FROM reportimpressionday
) sub;
रिपोर्ट इंप्रेशन
के लिए एक है बड़ा? तब यह उस संख्या से अधिक हो सकता है जिसके लिए किसी अनुक्रमणिका से सहायता की अपेक्षा की जाती है।
आम तौर पर, आपकी अनुक्रमणिका reportimpression_datelocal_index
on (datelocal) इसके लिए अच्छा लगता है, और reportimpression_viewership_index
यहां तक कि इंडेक्स-ओनली स्कैन की अनुमति देता है यदि ऑटोवैक्यूम टेबल पर राइट लोड को हरा देता है। (हालांकि इंप्रेशन
&आयु समूह
इसके लिए केवल डेड फ्रेट हैं और यह इसके बिना भी बेहतर काम करेगा)।
जवाब
आपको 26.6 प्रतिशत मिला है, और दिन 26.4 प्रतिशत है
मेरी क्वेरी के लिए। इतने बड़े प्रतिशत के लिए, इंडेक्स आमतौर पर उपयोगी नहीं होते हैं बिल्कुल . अनुक्रमिक स्कैन आमतौर पर सबसे तेज़ तरीका है। केवल-इंडेक्स स्कैन हो सकता है अभी भी समझ में आता है कि अंतर्निहित तालिका बहुत बड़ी है। (या आपके पास गंभीर . है टेबल ब्लोट, और कम फूला हुआ इंडेक्स, जो इंडेक्स को फिर से अधिक आकर्षक बनाता है।)
आपकी पहली क्वेरी केवल टिपिंग पॉइंट पर हो सकती है। समय सीमा को तब तक कम करने का प्रयास करें जब तक कि आप केवल-अनुक्रमणिका स्कैन न देखें। आप (बिटमैप) इंडेक्स स्कैन नहीं देखेंगे, जो सभी पंक्तियों के लगभग 5% से अधिक योग्य हैं (कई कारकों पर निर्भर करता है)।
प्रश्न
जैसा भी हो, इन संशोधित प्रश्नों पर विचार करें:
SELECT date_part('hour', datelocal) AS hour
, SUM(views) FILTER (WHERE gender = 'male') AS male
, SUM(views) FILTER (WHERE gender = 'female') AS female
FROM reportimpression
WHERE datelocal >= '2019-02-01'
AND datelocal < '2019-03-01' -- '2019-02-28' -- ?
GROUP BY 1
ORDER BY 1;
SELECT date_trunc('day', datelocal) AS day
, SUM(views) FILTER (WHERE gender = 'male') AS male
, SUM(views) FILTER (WHERE gender = 'female') AS female
FROM reportimpressionday
WHERE datelocal >= '2019-02-01'
AND datelocal < '2019-03-01'
GROUP BY 1
ORDER BY 1;
प्रमुख बिंदु
-
स्थानीयकृत तारीख प्रारूप . का उपयोग करते समय जैसे
'2-1-2019'
,to_timestamp()पर जाएं कोड>
स्पष्ट प्रारूप विनिर्देशों के साथ। अन्यथा यह स्थानीय सेटिंग्स पर निर्भर करता है और अलग-अलग सेटिंग्स वाले सत्र से कॉल करने पर (चुपचाप) टूट सकता है। इसके बजाय आईएसओ दिनांक / समय प्रारूपों का उपयोग करें जैसा कि दिखाया गया है जो स्थानीय सेटिंग्स पर निर्भर नहीं है। -
ऐसा लगता है कि आप पूरा माह . शामिल करना चाहते हैं फरवरी का। लेकिन आपकी क्वेरी ऊपरी सीमा पर छूट जाती है। एक के लिए, फरवरी में 29 दिन हो सकते हैं। एक
डेटलोकल <'2-28-2019'
28 फरवरी को भी शामिल नहीं है।डेटलोकल <'2019-03-01'
. का इस्तेमाल करें इसके बजाय। -
समान एक्सप्रेशन द्वारा समूहित और क्रमित करना . के लिए सस्ता है जैसा कि आपके पास
SELECT
. में है सूची यदि आप कर सकते हैं। इसलिएdate_trunc()
use का इस्तेमाल करें वहॉं भी। आवश्यकता के बिना विभिन्न अभिव्यक्तियों का प्रयोग न करें। अगर आपको जरूरत परिणाम में दिनांक भाग, इसे समूहीकृत अभिव्यक्ति पर लागू करें, जैसे:SELECT date_part('day', date_trunc('day', datelocal)) AS day ... GROUP BY date_trunc('day', datelocal) ORDER BY date_trunc('day', datelocal);
थोड़ा अधिक शोर वाला कोड, लेकिन तेज़ (और संभवतः क्वेरी प्लानर के लिए भी अनुकूलित करना आसान है)।
-
समग्र
फ़िल्टर
का उपयोग करें खंड पोस्टग्रेज 9.4 या बाद के संस्करण में। यह क्लीनर और थोड़ा तेज है। देखें: