मैं एक PostgreSQL क्वेरी को कैसे बेंचमार्क कर सकता हूं?


34

मैं उस क्वेरी को बेंचमार्क करना चाहता हूं जिसमें एक उपयोगकर्ता-परिभाषित फ़ंक्शन है जिसे मैंने पोस्टग्रेक्यूएल के लिए लिखा है। क्या इस तरह के बेंचमार्क को चलाने के लिए कोई मानक तरीके हैं?

मुझे पता है कि \timingpsql प्रॉम्प्ट पर समय के साथ चालू किया जा सकता है , लेकिन आदर्श रूप से मैं एक स्क्रिप्ट लेना चाहूंगा जो अपने आप ही सब कुछ का ख्याल रखे: क्वेरी को कुछ बार चलाना, प्रत्येक रन के बाद PostgreSQL कैश को क्लीयर करना (संभवतः पोस्टग्रॉक्सीक्यूएल को पुनरारंभ करके) सेवा), और औसत चलने वाले समय (और उपयोग की जाने वाली मेमोरी एक प्लस) का आउटपुट है।


3
बाहर की जाँच करें pgbench; आप इसे कस्टम स्क्रिप्ट के साथ चला सकते हैं जो आप चाहते हैं। Pg को रोकने और पुनः आरंभ करने और OS डिस्क कैश को छोड़ने के लिए एक आवरण खोल स्क्रिप्ट के साथ आपके पास सबसे अधिक जरूरत है।
क्रेग रिंगर

Dba.stackexchange.com/questions/3148/… का काफी डुप्लिकेट नहीं है ।
जॉन ऑफ ऑल ट्रेड्स

जवाबों:


29

व्यापक रूप से उपयोग किया जाने वाला उपकरण SQL कमांड है EXPLAIN ANALYZE, संभवतः उत्तर में अधिक विवरण के लिए अधिक विकल्पों के साथ। यह योजनाकार अनुमान और वास्तविक निष्पादन समय के साथ क्वेरी योजना को आउटपुट करता है।

आप कैश को क्यों साफ़ करना चाहेंगे? आमतौर पर अधिक संभावना उपयोग मामला यह है कि कैश पॉपुलेटेड है। यदि आप अभी भी उस मार्ग पर जाना चाहते हैं, तो SO पर संबंधित उत्तर दिया गया है

कैश को रीसेट नहीं करना, यहां कई पुनरावृत्तियों के साथ परीक्षण करने के दो सरल तरीके हैं:

सरल यूडीएफ

EXPLAIN ANALYZE
SELECT f_myfunc(g) FROM generate_series (1,1000) AS t(g);

या यादृच्छिक इनपुट के साथ - उदाहरण में 0 और 5000 के बीच यादृच्छिक संख्या:

EXPLAIN ANALYZE
SELECT f_myfunc((random()*5000)::int) FROM generate_series (1,1000) AS t(g);

या एक वास्तविक जीवन तालिका के साथ:

EXPLAIN ANALYZE
SELECT f_myfunc(my_column) FROM my_tbl;   -- LIMIT n

अधिक जटिल कार्य / प्रश्न

CREATE FUNCTION f_test(ct int, sql text) RETURNS void AS
$func$
DECLARE
   i int;
BEGIN

FOR i IN 1 .. $1 LOOP
    EXECUTE sql;  -- not safe against SQLi!
END LOOP;

END
$func$ LANGUAGE plpgsql

कॉल करें:

EXPLAIN ANALYZE
SELECT f_test(100, $x$SELECT * from MADLIB.gp('mock3', '{x1, x2, x3}', '{y1}', 100,20, 3)$x$

सावधान : क्वेरी वास्तव में निष्पादित है!
सावधान : सार्वजनिक उपयोग के लिए फिट नहीं है। संभव एसक्यूएल इंजेक्शन।

यदि आवश्यक हो तो फिर से, आप यादृच्छिक मापदंडों का उपयोग कर सकते हैं। संभवतः के USINGखंड के साथ EXECUTE

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.