PostgreSQL сурамдарынын аткарылышын көзөмөлдөө. 1-бөлүк - отчеттуулук

Инженер - латын тилинен которгондо - шыктанган.
Инженер баарын жасай алат. (c) R. Diesel.
Эпиграфтар.
PostgreSQL сурамдарынын аткарылышын көзөмөлдөө. 1-бөлүк - отчеттуулук
Же маалымат базасынын администратору эмне үчүн өзүнүн өткөн программалоону эстеп калышы керектиги жөнүндө окуя.

сөздөр

Бардык ысымдар өзгөртүлдү. Кокустуктар кокустуктар. Материал автордун жеке пикирин гана билдирет.

Кепилдиктерден баш тартуу: Пландаштырылган макалалар сериясы колдонулган таблицалардын жана сценарийлердин деталдуу жана так сүрөттөлүшүн камтыбайт. Материалдарды дароо "БОЛГОНДОЙ" колдонууга болбойт.
Биринчиден, материалдын чоң көлөмүнө байланыштуу,
экинчиден, чыныгы заказчынын вндуруштук базасы менен тыгыз байланышы.
Демек, макалалар эң жалпы формадагы идеяларды жана сүрөттөмөлөрдү гана камтыйт.
Балким, келечекте система GitHub сайтында жайгаштырылган деңгээлге чейин өсөт, же болбосо. Убакыт көрсөтөт.

Окуянын башталышы -"Баары кантип башталганы эсиңиздеби«.
Натыйжада эмне болду, жалпысынан алганда - "Синтез PostgreSQL иштешин жакшыртуу ыкмаларынын бири катары»

Мунун баары мага эмне үчүн керек?

Макул, биринчиден, унутпоо үчүн, пенсиядагы даңктуу күндөрдү эстеп.
Экинчиден, жазылгандарды системалаштыруу. Анткени кээде башым айланып, кээ бир жерлерин унутуп калам.

Эң негизгиси, бул кимдир бирөө үчүн пайдалуу болушу мүмкүн жана аларга дөңгөлөктү кайра ойлоп табуудан жана тырмоо чогултуудан качууга жардам берет. Башкача айтканда, кармаңызды жакшыртыңыз (Хабровдуку эмес). Анткени бул дүйнөдө эң баалуу нерсе – бул идеялар. Эң негизгиси идея табуу. Бирок идеяны реалдуулукка айландыруу – бул таза техникалык маселе.

Ошентип, баштайлы, аз-аздан...

Тапшырманын коюлушу.

Жеткиликтүү:

PostgreSQL(10.5) маалымат базасы, жүктүн аралаш түрү (OLTP+DSS), орточо жеңил жүк, AWS булутунда жайгашкан.
Маалымат базасына мониторинг жок; инфраструктуранын мониторинги минималдуу конфигурацияда стандарттуу AWS куралдары түрүндө берилет.

талап кылат:

Берилиштер базасынын иштешине жана абалына көз салыңыз, оор маалыматтар базасынын суроо-талаптарын оптималдаштыруу үчүн баштапкы маалыматка ээ болуңуз.

Кыскача киришүү же чечим варианттарын талдоо

Баштоо үчүн, келгиле, маселени чечүүнүн варианттарын инженер үчүн артыкчылыктар менен кемчиликтерди салыштырып талдоо позициясынан талдап көрөлү, ал эми штаттык график боюнча ага укугу бар адамдар пайда жана башкаруудагы жоготуулар.

1-вариант - "Талап боюнча иштөө"

Биз баарын ошол бойдон калтырабыз. Эгерде кардар функционалдык, маалымат базасынын же тиркемесинин иштешине канааттанбаса, анда ал DBA инженерлерине электрондук почта аркылуу же билет салгычында инцидент түзүү аркылуу кабарлайт.
Билдирүүнү алган инженер көйгөйдү түшүнүп, чечүү жолун сунуштайт же көйгөйдү арткы планга коёт, баары өзүнөн өзү чечилет деп үмүттөнөт жана баары бир, баары жакында унутулат.
Gingerbread жана donuts, көгөргөн жана бүдүрчөлөрGingerbread жана Donuts:
1. Кошумча эч нерсе кылуунун кереги жок.
2. Ар дайым актануу жана бурмалоо мүмкүнчүлүгү бар.
3. Өзүңүз каалагандай өткөрө турган көп убакыт.
Көкүрөктөр жана тактар:
1. Эртеби-кечпи, кардар бул дүйнөдө бар болуу жана универсалдуу адилеттүүлүктүн маңызы жөнүндө ойлонуп, өзүнө дагы бир жолу суроо берет - мен аларга акчамды эмне үчүн төлөп жатам? Мунун кесепети ар дайым бирдей - бир гана суроо - кардар качан тажатып, коштошуп кетет. Жана азыктандыруучу бош болот. Бул кайгылуу.
2. Инженердик өнүгүү - нөл.
3. Ишти пландаштырууда жана жүктөөдөгү кыйынчылыктар

2-вариант - "Даб менен бийлөө, буулоо жана бут кийим кийүү"

1-абзац-Мониторинг системасы эмнеге керек, сураныч менен баарын алабыз. Биз берилиштер сөздүгүнө жана динамикалык көрүнүштөргө ар кандай суроо-талаптарды аткарабыз, ар кандай эсептегичтерди күйгүзөбүз, баарын таблицаларга салып, тизмелерди жана таблицаларды мезгил-мезгили менен талдап турабыз. Натыйжада бизде кооз же анчалык кооз эмес графиктер, таблицалар, отчеттор бар. Негизгиси - көбүрөөк, көбүрөөк болушу керек.
2-абзац-Активдүүлүктү жаратып, мунун баарын талдап чыгабыз.
3-абзац-Биз белгилүү бир документти даярдап жатабыз, бул документти биз жөн эле атайбыз - “биз маалымат базасын кантип түзүшүбүз керек”.
4-абзац- Графиктердин жана цифралардын бул кереметтүүлүгүн көрүп, кардар баладай, аңкоолукка ишенет - азыр баары биз үчүн иштейт, жакында. Жана, ал оңой жана оорутпай өзүнүн каржылык ресурстары менен бөлүшөт. Жетекчилик дагы биздин инженерлер мыкты иштешет деп ишенет. Максималдуу жүктөө.
5-абзац-1-кадамды дайыма кайталаңыз.
Gingerbread жана donuts, көгөргөн жана бүдүрчөлөрGingerbread жана Donuts:
1. Жетекчилердин жана инженерлердин жашоосу жөнөкөй, алдын ала айтууга болот жана жигердүүлүккө бай. Баары ызы-чуу, баары бош эмес.
2. Кардардын жашоосу да жаман эмес – ал бир аз чыдап турса, баары ойдогудай болоруна ишенет. Жакшы болбой жатат, жакшы, дүйнө адилетсиз, кийинки жашоодо сен бактылуу болосуң.
Көкүрөктөр жана тактар:
1. Эртеби-кечпи, ошол эле ишти жасай турган, бирок бир аз арзаныраак болгон окшош кызматтын тезирээк провайдери пайда болот. Ал эми натыйжасы бирдей болсо, эмне үчүн көбүрөөк төлөш керек. Бул дагы азыктандыргычтын жок болушуна алып келет.
2. кызыксыз. Ар кандай маанисиз иш кандай кызыксыз.
3. Мурунку варианттагыдай эч кандай өнүгүү жок. Бирок инженер үчүн минус, биринчи варианттан айырмаланып, сиз дайыма IBD түзүшүңүз керек. Жана бул убакытты талап кылат. Сүйүктүү адамыңыздын жыргалчылыгы үчүн жумшасаңыз болот. Анткени сен өзүңө кам көрө албайсың, сага эч ким көңүл бурбайт.

3-вариант - Велосипед ойлоп табуунун кереги жок, аны сатып алып тебүү керек.

Бекеринен башка фирмалардын инженерлери пиво менен пиццаны жешпейт (оо, 90-жылдардагы Санкт-Петербургдун даңктуу күндөрү). Келгиле, жасалган, мүчүлүштүктөрү оңдолгон жана иштеп жаткан мониторинг тутумдарын колдонолу жана жалпысынан пайдалуу (жакшы, жок дегенде алардын жаратуучулары үчүн).
Gingerbread жана donuts, көгөргөн жана бүдүрчөлөрGingerbread жана Donuts:
1. Буга чейин ойлоп табылган нерсени ойлоп, убакытты текке кетирүүнүн кереги жок. Аны алып, колдонуңуз.
2. Мониторинг системалары келесоолор тарабынан жазылган эмес жана алар, албетте, пайдалуу.
3. Жумушчу мониторинг системалары, адатта, пайдалуу чыпкаланган маалыматты камсыз кылат.
Көкүрөктөр жана тактар:
1. Бул учурда инженер инженер эмес, жөн гана башка бирөөнүн буюмунун колдонуучусу же колдонуучу.
2. Кардар, жалпысынан алганда, ал түшүнгүсү келбеген жана түшүнгүсү келбеген нерсени сатып алуу зарылдыгына ынанышы керек жана жалпысынан жылдын бюджети бекитилген жана өзгөрбөйт. Андан кийин өзүнчө ресурсту бөлүп, аны белгилүү бир система үчүн конфигурациялашыңыз керек. Ошол. адегенде төлөп, төлөп, кайра төлөшүңүз керек. Ал эми кардар сараң. Бул жашоонун нормасы.

Эмне кылуу керек - Чернышевский? Сиздин сурооңуз абдан орундуу. (менен)

Бул учурда жана учурдагы кырдаалда, сиз муну бир аз башкача кыла аласыз - өзүбүздүн мониторинг системабызды жасайлы.
PostgreSQL сурамдарынын аткарылышын көзөмөлдөө. 1-бөлүк - отчеттуулук
Албетте, бул система эмес, сөздүн толук маанисинде, бул өтө катуу жана текебер, бирок, жок эле дегенде, кандайдыр бир жол менен сиздин тапшырмаңызды жеңилдетет жана аткаруу инциденттерин чечүү үчүн көбүрөөк маалымат чогултат. Кырдаалга түшүп калбоо үчүн - "ал жакка бар, мен кайдан, бир нерсе тап, мен эмнени билбейм".

Бул опциянын кандай жакшы жана жаман жактары бар:

артыкчылыктары:
1. Бул кызыктуу. Жок дегенде, бул туруктуу "маалымат файлын кичирейтүү, таблица мейкиндигин өзгөртүү ж.б." караганда кызыктуураак.
2. Бул жаңы көндүмдөр жана жаңы өнүгүү. Кайсы, эртеби-кечпи, сизге татыктуу пряник менен пончиктерди берет.
жактары:
1. Сиз иштөөгө туура келет. Талыкпай иште.
2. Бардык иш-чаралардын маанисин жана келечегин үзгүлтүксүз түшүндүрүп турууга туура келет.
3. Бир нерсени курмандыкка чалууга туура келет, анткени инженерге болгон жалгыз ресурс – убакыт – Аалам тарабынан чектелген.
4. Эң жаман жана эң жагымсыз нерсе - натыйжада "чычкан эмес, бака эмес, белгисиз жаныбар" деген шылтоо болушу мүмкүн.

Тобокелге барбагандар шампан ичпейт.
Ошентип, кызыктуу башталат.

Жалпы идея - схемалык түрдө

PostgreSQL сурамдарынын аткарылышын көзөмөлдөө. 1-бөлүк - отчеттуулук
(Макаладан алынган иллюстрация «Синтез PostgreSQL иштешин жакшыртуу ыкмаларынын бири катары")

Explanation:

  • Стандарттык PostgreSQL кеңейтүүсү “pg_stat_statements” максаттуу маалымат базасына орнотулган.
  • Мониторинг маалымат базасында биз баштапкы этапта pg_stat_statements тарыхын сактоо жана келечекте метрикаларды жана мониторингди орнотуу үчүн тейлөө таблицаларынын топтомун түзөбүз.
  • Мониторинг хостунда биз баш скрипттеринин топтомун түзөбүз, анын ичинде билет тутумунда инциденттерди жаратуу үчүн.

Кызмат столдору

Биринчиден, схемалык жөнөкөйлөштүрүлгөн ERD, аягында эмне болду:
PostgreSQL сурамдарынын аткарылышын көзөмөлдөө. 1-бөлүк - отчеттуулук
Таблицалардын кыскача баяндамасычекити — хост, инстанцияга кошулуу пункту
маалыматтар базасы - маалыматтар базасынын параметрлери
pg_stat_history - максаттуу маалымат базасынын pg_stat_statements көрүнүшүнүн убактылуу сүрөттөрүн сактоо үчүн тарыхый таблица
метрикалык_глоссарий - аткаруу көрсөткүчтөрүнүн сөздүгү
метрикалык_конфигурация — жеке метрикаларды конфигурациялоо
метрикалык — текшерилип жаткан суроо-талап үчүн белгилүү бир метрика
metric_alert_history - аткаруу эскертүүлөрүнүн тарыхы
log_query — AWSден жүктөлүп алынган PostgreSQL журнал файлынан талданган жазууларды сактоо үчүн тейлөө таблицасы
баштапкы — негиз катары колдонулган мезгилдердин параметрлери
өткөрүү пункту — маалымат базасынын абалын текшерүү үчүн метрикаларды конфигурациялоо
checkpoint_alert_history — маалымат базасынын ден соолугун текшерүү метрикасынын эскертүү тарыхы
pg_stat_db_queries — активдүү суроо-талаптардын тейлөө таблицасы
иш_журнал — ишмердүүлүк журналынын тейлөө таблицасы
trap_oid — капкан конфигурациясынын тейлөө таблицасы

1-этап - аткаруу жөнүндө статистикалык маалыматтарды чогултуу жана отчетторду алуу

Таблица статистикалык маалыматты сактоо үчүн колдонулат pg_stat_history
pg_stat_history таблица түзүмү

                                          Таблица "public.pg_stat_history" Мамыча | Type | Модификаторлор---------------------+-------------------------- - -+------------------------------------------ id | integer | null эмес default nextval('pg_stat_history_id_seq'::regclass) snapshot_timestamp | убакыт алкагы жок убакыт белгиси | database_id | integer | dbid | oid | userid | oid | queryid | bigint | суроо | текст | чалуулар | bigint | жалпы_убакыт | кош тактык | min_time | кош тактык | максималдуу_убакыт | кош тактык | орточо_убакыт | кош тактык | stddev_time | кош тактык | саптар | bigint | shared_blks_hit | bigint | shared_blks_read | bigint | shared_blks_dirtied | bigint | shared_blks_written | bigint | local_blks_hit | bigint | local_blks_read | bigint | local_blks_dirtied | bigint | local_blks_written | bigint | temp_blks_read | bigint | temp_blks_written | bigint | blk_read_time | кош тактык | blk_write_time | кош тактык | baseline_id | integer | Индекстер: "pg_stat_history_pkey" PRIMARY KEY, btree (id) "database_idx" btree (database_id) "queryid_idx" btree (queryid) "snapshot_timestamp_idx" btree (snapshot_timestamp) Тышкы ачкыч чектөөлөрү "REYF" МААЛЫМАТТАРДЫН базасы (id ) КАСКАДЫ ЖОЮУ БОЮНЧА

Көрүнүп тургандай, таблица жөн гана жыйынды көрүү маалыматтары pg_stat_statements максаттуу маалымат базасында.

Бул үстөлдү колдонуу абдан жөнөкөй

pg_stat_history ар бир саат үчүн сурамдын аткарылышынын топтолгон статистикасын көрсөтөт. Ар бир сааттын башында таблица толтурулгандан кийин статистика pg_stat_statements менен баштапкы абалга келтирүү pg_stat_statements_reset().
Эскертүү: Аткаруу узактыгы 1 секунддан ашкан сурамдар үчүн статистика чогултулат.
pg_stat_history жадыбалын толтуруу

--pg_stat_history.sql
CREATE OR REPLACE FUNCTION pg_stat_history( ) RETURNS boolean AS $$
DECLARE
  endpoint_rec record ;
  database_rec record ;
  pg_stat_snapshot record ;
  current_snapshot_timestamp timestamp without time zone;
BEGIN
  current_snapshot_timestamp = date_trunc('minute',now());  
  
  FOR endpoint_rec IN SELECT * FROM endpoint 
  LOOP
    FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id 
	  LOOP
	    
		RAISE NOTICE 'NEW SHAPSHOT IS CREATING';
		
		--Connect to the target DB	  
	    EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||endpoint_rec.host||' dbname='||database_rec.name||' user=USER password=PASSWORD '')';
 
        RAISE NOTICE 'host % and dbname % ',endpoint_rec.host,database_rec.name;
		RAISE NOTICE 'Creating snapshot of pg_stat_statements for database %',database_rec.name;
		
		SELECT 
	      *
		INTO 
		  pg_stat_snapshot
	    FROM dblink('LINK1',
	      'SELECT 
	       dbid , SUM(calls),SUM(total_time),SUM(rows) ,SUM(shared_blks_hit) ,SUM(shared_blks_read) ,SUM(shared_blks_dirtied) ,SUM(shared_blks_written) , 
           SUM(local_blks_hit) , SUM(local_blks_read) , SUM(local_blks_dirtied) , SUM(local_blks_written) , SUM(temp_blks_read) , SUM(temp_blks_written) , SUM(blk_read_time) , SUM(blk_write_time)
	       FROM pg_stat_statements WHERE dbid=(SELECT oid from pg_database where datname=current_database() ) 
		   GROUP BY dbid
  	      '
	               )
	      AS t
	       ( dbid oid , calls bigint , 
  	         total_time double precision , 
	         rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written	 bigint ,
             local_blks_hit	 bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,
             temp_blks_read	 bigint ,temp_blks_written bigint ,
             blk_read_time double precision , blk_write_time double precision	  
	       );
		 
		INSERT INTO pg_stat_history
          ( 
		    snapshot_timestamp  ,database_id  ,
			dbid , calls  ,total_time ,
            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , 	 	
            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, 	
            blk_read_time, blk_write_time 
		  )		  
	    VALUES
	      (
	       current_snapshot_timestamp ,
		   database_rec.id ,
	       pg_stat_snapshot.dbid ,pg_stat_snapshot.calls,
	       pg_stat_snapshot.total_time,
	       pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written , 
           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , 
	       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time 	   
	      );		   
		  
        RAISE NOTICE 'Creating snapshot of pg_stat_statements for queries with min_time more than 1000ms';
	
        FOR pg_stat_snapshot IN
          --All queries with max_time greater than 1000 ms
	      SELECT 
	        *
	      FROM dblink('LINK1',
	        'SELECT 
	         dbid , userid ,queryid,query,calls,total_time,min_time ,max_time,mean_time, stddev_time ,rows ,shared_blks_hit ,
			 shared_blks_read ,shared_blks_dirtied ,shared_blks_written , 
             local_blks_hit , local_blks_read , local_blks_dirtied , 
			 local_blks_written , temp_blks_read , temp_blks_written , blk_read_time , 
			 blk_write_time
	         FROM pg_stat_statements 
			 WHERE dbid=(SELECT oid from pg_database where datname=current_database() AND min_time >= 1000 ) 
  	        '

	                  )
	        AS t
	         ( dbid oid , userid oid , queryid bigint ,query text , calls bigint , 
  	           total_time double precision ,min_time double precision	 ,max_time double precision	 , mean_time double precision	 ,  stddev_time double precision	 , 
	           rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written	 bigint ,
               local_blks_hit	 bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,
               temp_blks_read	 bigint ,temp_blks_written bigint ,
               blk_read_time double precision , blk_write_time double precision	  
	         )
	    LOOP
		  INSERT INTO pg_stat_history
          ( 
		    snapshot_timestamp  ,database_id  ,
			dbid ,userid  , queryid  , query  , calls  ,total_time ,min_time ,max_time ,mean_time ,stddev_time ,
            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , 	 	
            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, 	
            blk_read_time, blk_write_time 
		  )		  
	      VALUES
	      (
	       current_snapshot_timestamp ,
		   database_rec.id ,
	       pg_stat_snapshot.dbid ,pg_stat_snapshot.userid ,pg_stat_snapshot.queryid,pg_stat_snapshot.query,pg_stat_snapshot.calls,
	       pg_stat_snapshot.total_time,pg_stat_snapshot.min_time ,pg_stat_snapshot.max_time,pg_stat_snapshot.mean_time, pg_stat_snapshot.stddev_time ,
	       pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written , 
           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , 
	       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time 	   
	      );
		  
        END LOOP;

        PERFORM dblink_disconnect('LINK1');  
				
	  END LOOP ;--FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id 
    
  END LOOP;

RETURN TRUE;  
END
$$ LANGUAGE plpgsql;

Натыйжада, таблицада бир нече убакыт өткөндөн кийин pg_stat_history бизде таблицадагы мазмундун сүрөттөрүнүн жыйындысы болот pg_stat_statements максаттуу маалымат базасы.

Чынында отчет берип жатат

Жөнөкөй суроолорду колдонуу менен сиз абдан пайдалуу жана кызыктуу отчетторду ала аласыз.

Белгилүү бир мезгил үчүн топтолгон маалыматтар

справка

SELECT 
  database_id , 
  SUM(calls) AS calls ,SUM(total_time)  AS total_time ,
  SUM(rows) AS rows , SUM(shared_blks_hit)  AS shared_blks_hit,
  SUM(shared_blks_read) AS shared_blks_read ,
  SUM(shared_blks_dirtied) AS shared_blks_dirtied,
  SUM(shared_blks_written) AS shared_blks_written , 
  SUM(local_blks_hit) AS local_blks_hit , 
  SUM(local_blks_read) AS local_blks_read , 
  SUM(local_blks_dirtied) AS local_blks_dirtied , 
  SUM(local_blks_written)  AS local_blks_written,
  SUM(temp_blks_read) AS temp_blks_read, 
  SUM(temp_blks_written) temp_blks_written , 
  SUM(blk_read_time) AS blk_read_time , 
  SUM(blk_write_time) AS blk_write_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY database_id ;

DB Time

to_char(интервал '1 миллисекунд' * pg_total_stat_history_rec.total_time, 'HH24:MI:SS.MS')

I/O Time

to_char(интервал '1 миллисекунд' * ( pg_total_stat_history_rec.blk_read_time + pg_total_stat_history_rec.blk_write_time ), 'HH24:MI:SS.MS')

Total_time боюнча TOP10 SQL

справка

SELECT 
  queryid , 
  SUM(calls) AS calls ,
  SUM(total_time)  AS total_time  	
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT 
GROUP BY queryid 
ORDER BY 3 DESC 
LIMIT 10
------------------------------------------------- ---------------------------------- | ЖАЛПЫ АТКАРЫЛУУ УБАКЫТЫ БОЮНЧА TOP10 SQL | #| queryid| чалуулар| чалууларды %| жалпы_убакыт (мс) | dbtime % +----------+-----------+-----------+-----------+ ------ ----------------------------------+---------- | 1| 821760255| 2| .00001|00:03:23.141( 203141.681 мс.)| 5.42 | 2| 4152624390| 2| .00001|00:03:13.929( 193929.215 мс.)| 5.17 | 3| 1484454471| 4| .00001|00:02:09.129( 129129.057 мс.)| 3.44 | 4| 655729273| 1| .00000|00:02:01.869( 121869.981 мс.)| 3.25 | 5| 2460318461| 1| .00000|00:01:33.113( 93113.835 мс.)| 2.48 | 6| 2194493487| 4| .00001|00:00:17.377( 17377.868 мс.)| .46 | 7| 1053044345| 1| .00000|00:00:06.156( 6156.352 мс.)| .16 | 8| 3644780286| 1| .00000|00:00:01.063( 1063.830 мс.)| .03

Жалпы I/O убактысы боюнча TOP10 SQL

справка

SELECT 
  queryid , 
  SUM(calls) AS calls ,
  SUM(blk_read_time + blk_write_time)  AS io_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY  queryid 
ORDER BY 3 DESC 
LIMIT 10
------------------------------------------------- --------------------------------------- | ЖАЛПЫ I/O УБАКЫТЫ БОЮНЧА TOP10 SQL | #| queryid| чалуулар| чалууларды %| I/O time (ms)|db I/O time % +----+-----------+-----------+------ --------------------+--------------------------------+----- ------ -- | 1| 4152624390| 2| .00001|00:08:31.616( 511616.592 мс.)| 31.06 | 2| 821760255| 2| .00001|00:08:27.099( 507099.036 мс.)| 30.78 | 3| 655729273| 1| .00000|00:05:02.209( 302209.137 мс.)| 18.35 | 4| 2460318461| 1| .00000|00:04:05.981( 245981.117 мс.)| 14.93 | 5| 1484454471| 4| .00001|00:00:39.144( 39144.221 мс.)| 2.38 | 6| 2194493487| 4| .00001|00:00:18.182( 18182.816 мс.)| 1.10 | 7| 1053044345| 1| .00000|00:00:16.611( 16611.722 мс.)| 1.01 | 8| 3644780286| 1| .00000|00:00:00.436( 436.205 мс.)| .03

TOP10 SQL максималдуу аткаруу убактысы боюнча

справка

SELECT 
  id AS snapshotid , 
  queryid , 
  snapshot_timestamp ,  
  max_time 
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 4 DESC 
LIMIT 10

------------------------------------------------- --------------------------------------- | MAX АТКАРЫЛУУ УБАКЫТЫ БОЮНЧА TOP10 SQL | #| snapshot| snapshotID| queryid| максималдуу_убакыт (мс) +----+------------------+-----------+--------- --+--------------------------------------- | 1| 05.04.2019 01:03| 4169| 655729273| 00:02:01.869( 121869.981 ms.) | 2| 04.04.2019 17:00| 4153| 821760255| 00:01:41.570( 101570.841 мс.) | 3| 04.04.2019 16:00| 4146| 821760255| 00:01:41.570( 101570.841 мс.) | 4| 04.04.2019 16:00| 4144| 4152624390| 00:01:36.964(96964.607 ms.) | 5| 04.04.2019 17:00| 4151| 4152624390| 00:01:36.964(96964.607 ms.) | 6| 05.04.2019 10:00| 4188| 1484454471| 00:01:33.452( 93452.150 ms.) | 7| 04.04.2019 17:00| 4150| 2460318461| 00:01:33.113(93113.835 ms.) | 8| 04.04.2019 15:00| 4140| 1484454471| 00:00:11.892( 11892.302 мс.) | 9| 04.04.2019 16:00| 4145| 1484454471| 00:00:11.892( 11892.302 мс.) | 10| 04.04.2019 17:00| 4152| 1484454471| 00:00:11.892( 11892.302 мс.)

SHARED буфери боюнча TOP10 SQL окуу/жазуу

справка

SELECT 
  id AS snapshotid , 
  queryid ,
  snapshot_timestamp , 
  shared_blks_read , 
  shared_blks_written 
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
  ( shared_blks_read > 0 OR shared_blks_written > 0 )
ORDER BY 4 DESC  , 5 DESC 
LIMIT 10
------------------------------------------------- ------------------------------------------------ | ТОП10 SQL БӨЛҮШКӨН БУФЕР ОКУУ/ЖАЗУУ | #| snapshot| snapshotID| queryid| бөлүшүлгөн блокторду окуу| бөлүшүлгөн блокторду жазуу +----+------------------+-----------+---------- -+--------------------+--------------------- | 1| 04.04.2019 17:00| 4153| 821760255| 797308| 0 | 2| 04.04.2019 16:00| 4146| 821760255| 797308| 0 | 3| 05.04.2019 01:03| 4169| 655729273| 797158| 0 | 4| 04.04.2019 16:00| 4144| 4152624390| 756514| 0 | 5| 04.04.2019 17:00| 4151| 4152624390| 756514| 0 | 6| 04.04.2019 17:00| 4150| 2460318461| 734117| 0 | 7| 04.04.2019 17:00| 4155| 3644780286| 52973| 0 | 8| 05.04.2019 01:03| 4168| 1053044345| 52818| 0 | 9| 04.04.2019 15:00| 4141| 2194493487| 52813| 0 | 10| 04.04.2019 16:00| 4147| 2194493487| 52813| 0 ------------------------------------------------- -------------------------------------

Максималдуу аткаруу убактысы боюнча суроо-талаптарды бөлүштүрүүнүн гистограммасы

Суранычтар

SELECT  
  MIN(max_time) AS hist_min  , 
  MAX(max_time) AS hist_max , 
  (( MAX(max_time) - MIN(min_time) ) / hist_columns ) as hist_width
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT ;

SELECT 
  SUM(calls) AS calls
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND
  database_id =DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND 
  ( max_time >= hist_current_min AND  max_time < hist_current_max ) ;
|------------------------------------------------ - --------------------------------------------- | MAX_TIME HISTOGRAM | БАРДЫГЫ ЧАЛУУЛАР: 33851920 | MIN TIME: 00:00:01.063 | МАКС УБАКЫТ: 00:02:01.869 ------------------------------------------ --------------------------------------- | мин узактыгы| максималдуу узактыгы| чалуулар +---------------------------------+---------------------- ---------------------+---------- | 00:00:01.063( 1063.830 ms.) | 00:00:13.144( 13144.445 мс.) | 9 | 00:00:13.144( 13144.445 мс.) | 00:00:25.225( 25225.060 ms.) | 0 | 00:00:25.225( 25225.060 ms.) | 00:00:37.305( 37305.675 ms.) | 0 | 00:00:37.305( 37305.675 ms.) | 00:00:49.386( 49386.290 ms.) | 0 | 00:00:49.386( 49386.290 ms.) | 00:01:01.466( 61466.906 ms.) | 0 | 00:01:01.466( 61466.906 ms.) | 00:01:13.547( 73547.521 ms.) | 0 | 00:01:13.547( 73547.521 ms.) | 00:01:25.628( 85628.136 мс.) | 0 | 00:01:25.628( 85628.136 мс.) | 00:01:37.708( 97708.751 ms.) | 4 | 00:01:37.708( 97708.751 ms.) | 00:01:49.789( 109789.366 мс.) | 2 | 00:01:49.789( 109789.366 мс.) | 00:02:01.869( 121869.981 ms.) | 0

Секундасына суроо боюнча ТОП10 сүрөт

Суранычтар

--pg_qps.sql
--Calculate Query Per Second 
CREATE OR REPLACE FUNCTION pg_qps( pg_stat_history_id integer ) RETURNS double precision AS $$
DECLARE
 pg_stat_history_rec record ;
 prev_pg_stat_history_id integer ;
 prev_pg_stat_history_rec record;
 total_seconds double precision ;
 result double precision;
BEGIN 
  result = 0 ;
  
  SELECT *
  INTO pg_stat_history_rec
  FROM 
    pg_stat_history
  WHERE id = pg_stat_history_id ;

  IF pg_stat_history_rec.snapshot_timestamp IS NULL 
  THEN
    RAISE EXCEPTION 'ERROR - Not found pg_stat_history for id = %',pg_stat_history_id;
  END IF ;  
  
 --RAISE NOTICE 'pg_stat_history_id = % , snapshot_timestamp = %', pg_stat_history_id , 
 pg_stat_history_rec.snapshot_timestamp ;
  
  SELECT 
    MAX(id)   
  INTO
    prev_pg_stat_history_id
  FROM
    pg_stat_history
  WHERE 
    database_id = pg_stat_history_rec.database_id AND
	queryid IS NULL AND
	id < pg_stat_history_rec.id ;

  IF prev_pg_stat_history_id IS NULL 
  THEN
    RAISE NOTICE 'Not found previous pg_stat_history shapshot for id = %',pg_stat_history_id;
	RETURN NULL ;
  END IF;
  
  SELECT *
  INTO prev_pg_stat_history_rec
  FROM 
    pg_stat_history
  WHERE id = prev_pg_stat_history_id ;
  
  --RAISE NOTICE 'prev_pg_stat_history_id = % , prev_snapshot_timestamp = %', prev_pg_stat_history_id , prev_pg_stat_history_rec.snapshot_timestamp ;    

  total_seconds = extract(epoch from ( pg_stat_history_rec.snapshot_timestamp - prev_pg_stat_history_rec.snapshot_timestamp ));
  
  --RAISE NOTICE 'total_seconds = % ', total_seconds ;    
  
  --RAISE NOTICE 'calls = % ', pg_stat_history_rec.calls ;      
  
  IF total_seconds > 0 
  THEN
    result = pg_stat_history_rec.calls / total_seconds ;
  ELSE
   result = 0 ; 
  END IF;
   
 RETURN result ;
END
$$ LANGUAGE plpgsql;


SELECT 
  id , 
  snapshot_timestamp ,
  calls , 	
  total_time , 
  ( select pg_qps( id )) AS QPS ,
  blk_read_time ,
  blk_write_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
  ( select pg_qps( id )) IS NOT NULL 
ORDER BY 5 DESC 
LIMIT 10
|------------------------------------------------ - --------------------------------------------- | QueryPerSeconds номерлери боюнча буйрутмаланган TOP10 сүрөт ------------------------------------------------------ ------------------------------------------------- ------------------------------------------------- | #| snapshot| snapshotID| чалуулар| жалпы dbtime| QPS| I/O time| Киргизүү/чыгаруу убактысы % +-----+------------------+-----------+------- ----+---------------------------------+---------- -+---------------------------------+----------- | 1| 04.04.2019 20:04| 4161| 5758631| 00:06:30.513( 390513.926 мс.)| 1573.396| 00:00:01.470( 1470.110 ms.)| .376 | 2| 04.04.2019 17:00| 4149| 3529197| 00:11:48.830( 708830.618 мс.)| 980.332| 00:12:47.834( 767834.052 мс.)| 108.324 | 3| 04.04.2019 16:00| 4143| 3525360| 00:10:13.492( 613492.351 мс.)| 979.267| 00:08:41.396(521396.555 мс.)| 84.988 | 4| 04.04.2019 21:03| 4163| 2781536| 00:03:06.470( 186470.979 мс.)| 785.745| 00:00:00.249(249.865 мс.)| .134 | 5| 04.04.2019 19:03| 4159| 2890362| 00:03:16.784( 196784.755 мс.)| 776.979| 00:00:01.441( 1441.386 мс.)| .732 | 6| 04.04.2019 14:00| 4137| 2397326| 00:04:43.033( 283033.854 мс.)| 665.924| 00:00:00.024(24.505 мс.)| .009 | 7| 04.04.2019 15:00| 4139| 2394416| 00:04:51.435( 291435.010 мс.)| 665.116| 00:00:12.025( 12025.895 ms.)| 4.126 | 8| 04.04.2019 13:00| 4135| 2373043| 00:04:26.791( 266791.988 мс.)| 659.179| 00:00:00.064( 64.261 мс.)| .024 | 9| 05.04.2019 01:03| 4167| 4387191| 00:06:51.380( 411380.293 мс.)| 609.332| 00:05:18.847( 318847.407 мс.)| 77.507 | 10| 04.04.2019 18:01| 4157| 1145596| 00:01:19.217( 79217.372 мс.)| 313.004| 00:00:01.319( 1319.676 мс.)| 1.666

QueryPerSeconds жана киргизүү/чыгаруу убактысы менен сааттык аткаруу тарыхы

справка

SELECT 
  id , 
  snapshot_timestamp ,
  calls , 	
  total_time , 
  ( select pg_qps( id )) AS QPS ,
  blk_read_time ,
  blk_write_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 2
|-----------------------------------------------------------------------------------------------
| HOURLY EXECUTION HISTORY  WITH QueryPerSeconds and I/O Time
-----------------------------------------------------------------------------------------------------------------------------------------------
| QUERY PER SECOND HISTORY
|    #|          snapshot| snapshotID|      calls|                      total dbtime|        QPS|                          I/O time| I/O time %
+-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+-----------
|    1|  04.04.2019 11:00|       4131|       3747|  00:00:00.835(       835.374 ms.)|      1.041|  00:00:00.000(          .000 ms.)|       .000
|    2|  04.04.2019 12:00|       4133|    1002722|  00:01:52.419(    112419.376 ms.)|    278.534|  00:00:00.149(       149.105 ms.)|       .133
|    3|  04.04.2019 13:00|       4135|    2373043|  00:04:26.791(    266791.988 ms.)|    659.179|  00:00:00.064(        64.261 ms.)|       .024
|    4|  04.04.2019 14:00|       4137|    2397326|  00:04:43.033(    283033.854 ms.)|    665.924|  00:00:00.024(        24.505 ms.)|       .009
|    5|  04.04.2019 15:00|       4139|    2394416|  00:04:51.435(    291435.010 ms.)|    665.116|  00:00:12.025(     12025.895 ms.)|      4.126
|    6|  04.04.2019 16:00|       4143|    3525360|  00:10:13.492(    613492.351 ms.)|    979.267|  00:08:41.396(    521396.555 ms.)|     84.988
|    7|  04.04.2019 17:00|       4149|    3529197|  00:11:48.830(    708830.618 ms.)|    980.332|  00:12:47.834(    767834.052 ms.)|    108.324
|    8|  04.04.2019 18:01|       4157|    1145596|  00:01:19.217(     79217.372 ms.)|    313.004|  00:00:01.319(      1319.676 ms.)|      1.666
|    9|  04.04.2019 19:03|       4159|    2890362|  00:03:16.784(    196784.755 ms.)|    776.979|  00:00:01.441(      1441.386 ms.)|       .732
|   10|  04.04.2019 20:04|       4161|    5758631|  00:06:30.513(    390513.926 ms.)|   1573.396|  00:00:01.470(      1470.110 ms.)|       .376
|   11|  04.04.2019 21:03|       4163|    2781536|  00:03:06.470(    186470.979 ms.)|    785.745|  00:00:00.249(       249.865 ms.)|       .134
|   12|  04.04.2019 23:03|       4165|    1443155|  00:01:34.467(     94467.539 ms.)|    200.438|  00:00:00.015(        15.287 ms.)|       .016
|   13|  05.04.2019 01:03|       4167|    4387191|  00:06:51.380(    411380.293 ms.)|    609.332|  00:05:18.847(    318847.407 ms.)|     77.507
|   14|  05.04.2019 02:03|       4171|     189852|  00:00:10.989(     10989.899 ms.)|     52.737|  00:00:00.539(       539.110 ms.)|      4.906
|   15|  05.04.2019 03:01|       4173|       3627|  00:00:00.103(       103.000 ms.)|      1.042|  00:00:00.004(         4.131 ms.)|      4.010
|   16|  05.04.2019 04:00|       4175|       3627|  00:00:00.085(        85.235 ms.)|      1.025|  00:00:00.003(         3.811 ms.)|      4.471
|   17|  05.04.2019 05:00|       4177|       3747|  00:00:00.849(       849.454 ms.)|      1.041|  00:00:00.006(         6.124 ms.)|       .721
|   18|  05.04.2019 06:00|       4179|       3747|  00:00:00.849(       849.561 ms.)|      1.041|  00:00:00.000(          .051 ms.)|       .006
|   19|  05.04.2019 07:00|       4181|       3747|  00:00:00.839(       839.416 ms.)|      1.041|  00:00:00.000(          .062 ms.)|       .007
|   20|  05.04.2019 08:00|       4183|       3747|  00:00:00.846(       846.382 ms.)|      1.041|  00:00:00.000(          .007 ms.)|       .001
|   21|  05.04.2019 09:00|       4185|       3747|  00:00:00.855(       855.426 ms.)|      1.041|  00:00:00.000(          .065 ms.)|       .008
|   22|  05.04.2019 10:00|       4187|       3797|  00:01:40.150(    100150.165 ms.)|      1.055|  00:00:21.845(     21845.217 ms.)|     21.812

Бардык SQL-тандоолордун тексти

справка

SELECT 
  queryid , 
  query 
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY queryid , query

жыйынтык

Көрүнүп тургандай, жөнөкөй каражаттарды колдонуу менен, сиз маалымат базасынын иш жүгү жана абалы жөнүндө көптөгөн пайдалуу маалыматтарды ала аласыз.

Эскертүү:Эгерде биз сурамдын идентификациясын сурамдарга жазсак, анда биз өзүнчө суроо үчүн тарыхты алабыз (мейкиндикти үнөмдөө үчүн, өзүнчө суроо үчүн отчеттор алынып салынган).

Ошентип, сурамдардын аткарылышы боюнча статистикалык маалыматтар бар жана чогултулган.
Биринчи этап «статистикалык маалыматтарды чогултуу» аяктады.

Сиз экинчи этапка өтсөңүз болот - "аткаруу көрсөткүчтөрүн орнотуу".
PostgreSQL сурамдарынын аткарылышын көзөмөлдөө. 1-бөлүк - отчеттуулук

Бирок бул таптакыр башка окуя.

Уландысы бар…

Source: www.habr.com

Комментарий кошуу