Plpgsql তে লিখিত একটি ফাংশন আমন্ত্রণের ক্যোয়ারী পোস্ট পোস্ট করে


19

এটি ব্যবহার করার সময় pgadminবা ইউ- সার ডি ইফাইনড এফ আনশন (ইউডিএফ) এর মাধ্যমে এক্সিকিউটিভ করা কোনও স্কিল plsqlস্টেটমেন্টের জন্য কোনও ক্যোয়ারী প্ল্যান ধরে রাখার ক্ষেত্রে এটি সম্ভব । তাহলে আমি কীভাবে কোনও ইউডিএফের একটি বিশেষ অনুরোধের জন্য ক্যোয়ারী পরিকল্পনাটি ধরে রাখব? আমি ইউডিএফটিকে পেগডমিনে একক অপারেশনে বিমূর্ত দেখতে পাচ্ছি।EXPLAINF()

আমি ডকুমেন্টেশন দেখেছি কিন্তু কিছুই খুঁজে পেলাম না।

বর্তমানে আমি বিবৃতিগুলি টানছি এবং সেগুলি ম্যানুয়ালি চালাচ্ছি। তবে এটি বড় প্রশ্নের জন্য এটি কাটছে না।

উদাহরণস্বরূপ, নীচে ইউডিএফ বিবেচনা করুন। এই ইউডিএফ, যদিও এটির ক্যোরিয় স্ট্রিং প্রিন্ট করার ক্ষমতা রয়েছে, এটি একটি অনুলিপি-পেস্টের সাথে কাজ করবে না কারণ এটিতে একটি স্থানীয় তৈরি অস্থায়ী টেবিল রয়েছে, যা আপনি এটি আটকানো এবং চালনার সময় উপস্থিত নেই।

CREATE OR REPLACE FUNCTION get_paginated_search_results(
    forum_id_ INTEGER,
    query_    CHARACTER VARYING,
    from_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
    to_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
    in_categories_ INTEGER[] DEFAULT '{}')
RETURNS SETOF post_result_entry AS $$
DECLARE
    join_string CHARACTER VARYING := ' ';
    from_where_date CHARACTER VARYING := ' ';
    to_where_date CHARACTER VARYING := ' ';
    query_string_ CHARACTER VARYING := ' ';
BEGIN
    IF NOT from_date_ IS NULL THEN
        from_where_date := ' AND fp.posted_at > ''' || from_date_ || '''';
    END IF;

    IF NOT to_date_ IS NULL THEN
        to_where_date := ' AND fp.posted_at < ''' || to_date_ || '''';
    END IF;

    CREATE LOCAL TEMP TABLE un_cat(id) ON COMMIT DROP AS (select * from unnest(in_categories_)) ;

    if in_categories_ != '{}' THEN
        join_string := ' INNER JOIN forum_topics ft ON fp.topic_id = ft.id ' ||
        ' INNER JOIN un_cat uc ON uc.id = ft.category_id ' ;
    END IF;

    query_string_ := '
    SELECT index,posted_at,post_text,name,join_date,quotes
    FROM forum_posts fp
    INNER JOIN forum_user fu ON
    fu.forum_id = fp.forum_id AND fu.id = fp.user_id' ||
        join_string
    ||
    'WHERE fu.forum_id = ' || forum_id_ || ' AND
    to_tsvector(''english'',fp.post_text) @@ to_tsquery(''english'','''|| query_||''')' || 
        from_where_date || 
        to_where_date
    ||';';

    RAISE NOTICE '%', query_string_ ;

    RETURN QUERY
    EXECUTE query_string_;
END;
$$ LANGUAGE plpgsql;

উত্তর:


16

আপনার অটো-ব্যাখ্যার ব্যবহার করতে সক্ষম হওয়া উচিত । এটি চালু করুন এবং

SET auto_explain.log_min_duration = 0;

এবং সেই অধিবেশনটিতে চলমান সমস্ত বিবৃতিগুলির জন্য আপনার লগের পরিকল্পনাগুলি পাওয়া উচিত।

আপনি পারে এছাড়াও সেট করতে চান

SET auto_explain.log_analyze = true; তবে আপনি অবশ্যই সমস্ত কিছু দ্বিগুণ করে চালিয়ে যাবেন - একবার 'আসল' এর জন্য এবং একবার বিশ্লেষণ করার জন্য। একটি সময়োহীন পারফরম্যান্স পরীক্ষার পর্বের সময়, এই আউটপুটটি একা এক্সপ্ল্লেইন পরিকল্পনার চেয়ে অনেক বেশি কার্যকর হতে পারে, কারণ এটি বাস্তবে কী ঘটেছিল তা সরবরাহ করে।


4
@ এরউইন নীচে উল্লেখ করেছেন, আপনার অটো_এক্সপ্লেইন.লগ_নেস্টড_স্টেটমেন্টস = চালু করা উচিত।
rfusca

ধন্যবাদ, কৌতুক করেনি যে। এটি লজ্জার বিষয় যে এই কার্যকারিতাটি জিইউআইয়ের মাধ্যমে অ্যাক্সেসযোগ্য নয়।
হাসান সৈয়দ

@ আরফুসকা আপনি মূলত সবকিছু দ্বিগুণ করে চালাবেন তার প্রমাণ কোথায়? কিছু পরীক্ষা-নিরীক্ষা আমি এই আচরণটি প্রদর্শন করি না।
সেবাস্তিয়ান পোশাকি

বুঝতে পারেন এটি এই সময়ে 7 বছরের পুরানো ডাটাবেসটিকে উল্লেখ করছে। যদি আপনি একই ফলাফল না দেখেন তবে সম্ভবত এটি আর কাজ করে না।
rfusca

16

আমি @ আরফাসকার পরামর্শটি যুক্ত করেছি: পিএলপজিএসকিএল ফাংশনগুলির মধ্যে এসকিউএল স্টেটমেন্টগুলি নেস্টেড স্টেটমেন্ট হিসাবে বিবেচনা করা হয় এবং আপনাকে অতিরিক্ত প্যারামিটার সেট করতে হবে auto_explain.log_nested_statements

কিছু অন্যান্য এক্সটেনশানের বিপরীতে, আপনার এটির জন্য দৌড়াতে হবে নাCREATE EXTENSION । এটিকে আপনার সেশনে গতিশীলভাবে লোড করুন LOAD। আপনার সেশনটি এর মতো দেখতে পেল :

LOAD 'auto_explain';
SET auto_explain.log_min_duration = 1; -- exclude very fast trivial queries
SET auto_explain.log_nested_statements = ON; -- statements inside functions
-- SET auto_explain.log_analyze = ON; -- get actual times, too
SELECT * FROM get_paginated_search_results(...);

প্রচুর লগ আউটপুট উত্পাদন করতে পারে । বর্তমান auto_explain উপর ম্যানুয়াল। দেপেজ একটি ব্লগ নিবন্ধ লিখেছিলেন যখন এটি পোস্টগ্রিজ এসকিউএল 8.4 এর সাথে প্রবর্তিত হয়েছিল।


+1 - এত দিন হয়েছে, আমি লগ_নেস্টড_স্টেটমেন্টস লাইন স্থাপনের প্রয়োজনটি ভুলে গিয়েছি
rfusca

3
যাইহোক সঠিক সরঞ্জাম আনার জন্য আপনার কৃতিত্ব প্রাপ্য।
এরউইন ব্র্যান্ডসেটেটার

আমার অ্যামাজনের পরিচালিত পরিষেবা (আরডিএস) -এ একটি পোস্টগ্রিজ ডাটাবেস রয়েছে, যার জন্য LOAD 'auto_explain';ফেরত আসে ERROR: access to library "auto_explain" is not allowed। এই ক্ষেত্রে কি? আমার সাথে আমার ফাংশনগুলি হ্যাক করতে কিছু সাফল্য পেয়েছি return query explain select …তবে এটি শ্রমসাধ্য এবং ধীর।
poshest
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.