كملحق قصير للمقال ،
حاول إنشاء مثيل لـ ASH لـ PostgreSQL .
مهمة
تحتاج إلى ربط سجل العرض pg_stat_statemenets ، pg_stat_activity. نتيجة لذلك ، باستخدام محفوظات خطط التنفيذ من جدول خدمة log_query ، يمكنك الحصول على الكثير من المعلومات المفيدة لاستخدامها في حل حوادث الأداء وتحسين الاستعلامات.
تحذير.
بسبب حداثة الموضوع وفترة الاختبار غير المكتملة ، قد تحتوي المقالة على أخطاء. يتم تشجيع النقد والتعليقات بقوة ومتوقعة.
إدخال البيانات
الجدول History_pg_stat_activity جدول Pg_stat_db_queries CREATE TABLE pg_stat_db_queries ( database_id integer , queryid bigint , query text , max_time double precision );(
عرض ملموس mvw_pg_stat_queries CREATE MATERIALIZED VIEW public.mvw_pg_stat_queries AS SELECT t.queryid, t.max_time, t.query FROM public.dblink('LINK1'::text, 'SELECT queryid , max_time , query FROM pg_stat_statements WHERE dbid=(SELECT oid FROM pg_database WHERE datname=current_database() ) AND max_time >= 0 '::text) t(queryid bigint, max_time double precision, query text) WITH NO DATA;
جدول Log_query CREATE TABLE log_query ( id integer , queryid bigint , query_md5hash text , database_id integer , timepoint timestamp without time zone , query text , explained_plan text[] , plan_md5hash text , explained_plan_wo_costs text[] , plan_hash_value text , ip text, port text , pid integer );
الخوارزمية العامة
تحديث الجدول pg_stat_db_queries
قم بتحديث عرض المواد mvw_pg_stat_queries CREATE OR REPLACE FUNCTION refresh_pg_stat_queries_list( database_id int) RETURNS BOOLEAN AS $$ DECLARE result BOOLEAN ; database_rec record ; BEGIN SELECT * INTO database_rec FROM endpoint e JOIN database d ON e.id = d.endpoint_id WHERE d.id = database_id ; IF NOT database_rec.is_need_monitoring THEN RAISE NOTICE 'NO NEED MONITORING FOR database_id=%',database_id; return TRUE ; END IF ; EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||database_rec.host||' port=5432 dbname='||database_rec.name|| ' user='||database_rec.s_name||' password='||database_rec.s_pass|| ' '')'; REFRESH MATERIALIZED VIEW mvw_pg_stat_queries ; PERFORM dblink_disconnect('LINK1'); RETURN result; END $$ LANGUAGE plpgsql;
قم بملء جدول الاستعلامات pg_stat_db_queries CREATE OR REPLACE FUNCTION refresh_pg_stat_db_queries( ) RETURNS BOOLEAN AS $$ DECLARE result BOOLEAN ; database_rec record ; pg_stat_rec record ; BEGIN TRUNCATE pg_stat_db_queries; FOR database_rec IN SELECT * FROM database d LOOP IF NOT database_rec.is_need_monitoring THEN RAISE NOTICE 'NO NEED MONITORING FOR database_id=%',database_rec.id; CONTINUE ; END IF ; PERFORM refresh_pg_stat_queries_list( database_rec.id ) ; FOR pg_stat_rec IN SELECT * FROM mvw_pg_stat_queries LOOP INSERT INTO pg_stat_db_queries ( database_id , queryid , query , max_time ) VALUES ( database_rec.id , pg_stat_rec.queryid , pg_stat_rec.query , pg_stat_rec.max_time); END LOOP; END LOOP; RETURN TRUE; END $$ LANGUAGE plpgsql;
نتيجة لذلك ، يحتوي الجدول على نصوص استعلام طبيعية ، queryid ، الحد الأقصى لوقت تنفيذ الاستعلام في الوقت الحالي (يستخدم للمراقبة).
تعبئة log_query وتشكيل سجل لخطط التنفيذ.
يؤخذ نص الطلب الفعلي من ملف السجل. ملف السجل من المضيف الهدف إلى المضيف الرصد في أجزاء ، النصي باش ، كرون. لتوفير مساحة وبسبب تافهة مهمة نسخ جزء من ملف نصي من مضيف إلى مضيف ، لم يتم توفير البرنامج النصي.
تحليل ملف السجل واستخراج نص الاستعلام نتيجة لذلك ، يحتوي الجدول على نص الطلب الفعلي ، وخطط التنفيذ ، وقيمة التجزئة لخطة التنفيذ ، وقيمة التجزئة لنص الطلب.
ملء القيمة queryid في الجدول history_pg_stat_activity
update_history_pg_stat_activity_by_queryid.sql نتيجة لذلك ، يحتوي الجدول على قيمة queryid المقابلة لقيمة queryid للاستعلام.
يؤدي
عن طريق ربط pg_stat_activity ، pg_stat_statements ، log_query ، يمكنك الحصول على الكثير من المعلومات المفيدة حول الطلب ، على وجه الخصوص:
- تاريخ خطط التنفيذ.
- تاريخ طلب وقت وحدة المعالجة المركزية.
- طلب تاريخ الانتظار.
سيتم وصف البيانات والعديد من التقارير الإضافية في المقالة التالية.
تنمية
عن طريق ربط المعلومات المتاحة مع محفوظات طريقة العرض pg_locks ، يمكنك الحصول على معلومات حول القفل المحدد الذي كان ينتظره الطلب ، والأهم من ذلك ، ما هي العملية (الطلب) التي كانت تحتفظ بهذا القفل.
سيتم وصف حل هذه المشكلة في المقالة التالية. الآن الاختبار والصقل جارية.