PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

परिकलित चयन मान का पुन:उपयोग करें

परीक्षण का समय

आप 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) और अपने लिए देखें। परीक्षण>> अनुमान लगाना।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. बहिष्करण बाधा `बहिष्कृत उपयोग सार (c with &&)` का क्या अर्थ है?

  2. पोस्टग्रेएसक्यूएल अपडेट ट्रिगर

  3. टीसीपी कीप-अलाइव पीडीओ कनेक्शन पैरामीटर

  4. लेटरल जॉइन ट्रिग्राम इंडेक्स का उपयोग नहीं कर रहा है

  5. त्रुटि:INTO में या उसके निकट INTO को एक से अधिक बार निर्दिष्ट किया गया