परीक्षण का समय
आप EXPLAIN
. में प्रति पंक्ति अलग-अलग कार्यों का मूल्यांकन नहीं देखते हैं आउटपुट
EXPLAIN ANALYZE
. के साथ परीक्षण करें समग्र प्रभावशीलता की तुलना करने के लिए वास्तविक क्वेरी समय प्राप्त करने के लिए। कैशिंग कलाकृतियों को रद्द करने के लिए दो बार चलाएं। इस तरह के सरल प्रश्नों के लिए, आपको कुल रनटाइम के लिए अधिक विश्वसनीय नंबर मिलते हैं:
EXPLAIN (ANALYZE, TIMING OFF) SELECT ...
पोस्टग्रेज की आवश्यकता है 9.2+ . प्रति दस्तावेज़ :
दोहराए गए मूल्यांकन को रोकें
आम तौर पर, सबक्वेरी में भावों का मूल्यांकन एक बार किया जाता है . लेकिन पोस्टग्रेज तुच्छ सबक्वेरी को ध्वस्त कर सकता है अगर उसे लगता है कि यह तेज होगा।
एक अनुकूलन बाधा शुरू करने के लिए, आप CTE<का उपयोग कर सकते हैं /मजबूत>
सबक्वेरी के बजाय। यह गारंटी देता है कि पोस्टग्रेज ST_SnapToGrid(geom, 50)
. की गणना करता है केवल एक बार:
WITH cte AS (
SELECT ST_SnapToGrid(geom, 50) AS geom1
FROM points
)
SELECT COUNT(*) AS n
, ST_X(geom1) AS x
, ST_Y(geom1) AS y
FROM cte
GROUP BY geom1; -- see below
हालांकि, यह शायद धीमा है एक सीटीई के लिए अधिक ओवरहेड के कारण एक सबक्वायरी की तुलना में। फ़ंक्शन कॉल शायद बहुत सस्ता है। आम तौर पर, Postgres बेहतर तरीके से जानता है कि किसी क्वेरी योजना को कैसे अनुकूलित किया जाए। इस तरह के अनुकूलन अवरोध को तभी पेश करें जब आप बेहतर जानते हों।
सरल बनाएं
मैंने सबक्वेरी / CTE में परिकलित बिंदु का नाम geom1
. में बदल दिया है स्पष्ट करने के लिए यह मूल geom
. से अलग है . इससे अधिक महत्वपूर्ण . को स्पष्ट करने में सहायता मिलती है यहाँ बात:
GROUP BY geom1
इसके बजाय:
GROUP BY x, y
यह स्पष्ट रूप से सस्ता है - और इसका प्रभाव हो सकता है कि फ़ंक्शन कॉल दोहराया गया है या नहीं। तो, यह शायद सबसे तेज़ है:
SELECT COUNT(*) AS n
, ST_X(ST_SnapToGrid(geom, 50)) AS x
, ST_y(ST_SnapToGrid(geom, 50)) AS y
FROM points
GROUP BY ST_SnapToGrid(geom, 50); -- same here!
या शायद यह:
SELECT COUNT(*) AS n
, ST_X(geom1) AS x
, ST_y(geom1) AS y
FROM (
SELECT ST_SnapToGrid(geom, 50) AS geom1
FROM points
) AS tmp
GROUP BY geom1;
EXPLAIN ANALYZE
के साथ तीनों का परीक्षण करें या EXPLAIN (ANALYZE, TIMING OFF)
और अपने लिए देखें। परीक्षण>> अनुमान लगाना।