CodeGym /Kurslar /SQL SELF /Yavaş sorğuların analizi pg_stat_statements...

Yavaş sorğuların analizi pg_stat_statements ilə

SQL SELF
Səviyyə , Dərs
Mövcuddur

Real layihələrdə işləyəndə, tətbiqinlə eyni anda minlərlə istifadəçi əlaqə qurur. Onlar bazaya sorğular göndərir, məlumat əlavə edir, oxuyur, yeniləyir... Və birdən görürsən ki, serverin "inildəyir". Bu o deməkdir ki, sorğuların heç də optimal deyil. Bəzən "kağız üzərində" yaxşı görünən sorğu, əslində performans üçün fəlakət ola bilər. Bax, bu anda pg_stat_statements səhnəyə çıxır.

pg_stat_statements sənə imkan verir:

  1. Yavaş sorğuları izləmək.
  2. Hansı sorğunun neçə dəfə işlədiyini başa düşmək.
  3. Onların nə qədər vaxt apardığını bilmək.
  4. Sorğunun orta işləmə vaxtını görmək.
  5. Və ən əsası, bütün tətbiqi boş yerə yenidən yazmamaq!

pg_stat_statements strukturunu öyrənmək

Extension-u aktivləşdirəndən sonra bazanda xüsusi bir görünüş (pg_stat_statements) yaranır. Burda işlənmiş bütün sorğular barədə məlumat saxlanılır. Gəlin əvvəlcə baxaq, orda nə var:

SELECT * FROM pg_stat_statements LIMIT 1;

Nəticə belə görünə bilər (sadələşdirilmiş versiya):

query calls total_time rows shared_blks_read
SELECT * FROM students 500 20000 ms 5000 100

Qısa izahlar:

  • query — SQL-sorğunun özü.
  • calls — bu sorğu neçə dəfə işlədilib.
  • total_time — sorğu ümumilikdə nə qədər vaxt aparıb.
  • rows — sorğunun qaytardığı sətr sayı.
  • shared_blks_read — oxunan blokların sayı (əgər cache istifadə etmirsənsə, əsas diskə müraciət olunur).

Nəticələrin analizi

İndi pg_stat_statements aktivdir, gəlin yavaş sorğuları necə tapmaq olar, baxaq.

Ən yavaş sorğular

Ən çox vaxt aparan sorğuları tapmaq üçün belə bir sorğu istifadə edə bilərik:

SELECT query, total_time, calls, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 5;

Burda:

  • mean_time — bir sorğunun orta işləmə vaxtı (total_time / calls).
  • ORDER BY total_time DESC — ümumi işləmə vaxtına görə azalan sıralama.

Tez-tez işləyən sorğular

Bəzən problem yavaş sorğuda yox, çox işləyən sorğudadır. Məsələn:

SELECT query, calls
FROM pg_stat_statements
ORDER BY calls DESC
LIMIT 5;

Sorğuların optimallaşdırılması

  1. İndekslərdən istifadə et

Əgər görürsən ki, müəyyən sütunlar üzrə sorğular yavaşdır, yoxla ki, həmin sütunlarda index var, ya yox. Məsələn, students cədvəlin var, çoxlu sətri var və tez-tez last_name sahəsinə müraciət edirsən. Onda belə index yaratmaq olar:

CREATE INDEX idx_students_last_name ON students (last_name);
  1. Sorğunu yenidən yaz

Tutaq ki, görürsən SELECT * FROM orders WHERE amount > 1000 sorğusu çox vaxt aparır. Çox güman, "hər şey hər şeyə" lazım deyil, sadəcə lazım olan sütunları seçmək kifayətdir:

SELECT order_id, amount FROM orders WHERE amount > 1000;

Statistikanın sıfırlanması

Bəzən, yalnız yeni nəticələri görmək üçün (məsələn, optimizasiya sonrası), pg_stat_statements-dəki məlumatları təmizləmək lazımdır. Bunun üçün belə bir komanda var:

SELECT pg_stat_statements_reset();

Bu, kalkulyatordakı "Sıfırla" düyməsi kimidir. İcra edəndən sonra statistika yenidən toplanacaq.

Problemli sorğuların axtarışı

Təsəvvür elə ki, universitetin bazasının adminsən və tələbələr kütləvi şəkildə şikayət edir ki, şəxsi kabinetləri çox gec açılır. Sən qərara gəlirsən pg_stat_statements-ə baxasan:

Addım 1: Ən yavaş sorğuları tapmaq

SELECT query, total_time, calls, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 1;

Görürsən ki, SELECT * FROM students WHERE status = 'active' sorğusu 30 saniyə çəkir. Vay. Tez nəsə etmək lazımdır.

Addım 2: İndeksasiyanı yoxla students cədvəlini analiz edəndə başa düşürsən ki, status sütununda index yoxdur. Düzəldirsən:

CREATE INDEX idx_students_status ON students (status);

Addım 3: Nəticəni yoxla Optimizasiyadan sonra yenidən pg_stat_statements-ə baxırsan və görürsən ki, sorğu artıq 0.5 saniyəyə işləyir. Qələbə!

pg_stat_statements istifadə edəndə tez-tez buraxılan səhvlər

Bəzən adminlər sorğuları analiz edəndə səhvlər buraxır:

  1. Extension aktiv deyil. Əgər pg_stat_statements-i shared_preload_libraries-ə əlavə etməyi unutsan, statistika toplanmayacaq.
  2. İndeksasiyanı nəzərə almamaq. Hətta sorğular yavaş görünürsə də, problem düzgün index əlavə etməklə həll oluna bilər.
  3. Statistikanı sıfırlamamaq. Əgər pg_stat_statements_reset() işlətmirsənsə, köhnə məlumatlar cari analizə mane olur.

pg_stat_statements-dən istifadə etmək — bazanın GPS-navigatoru kimidir: sənə dəqiq göstərir harada "tıxac"dasansa və hətta necə yan keçmək lazım olduğunu deyir. Bu aləti düzgün quranda, bazanın performansını xeyli yaxşılaşdıra bilərsən.

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Ən çox çağırılan sorğuların müəyyən edilməsi
Ən çox çağırılan sorğuların müəyyən edilməsi
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
PostgreSQL Monitorinqi
PostgreSQL Monitorinqi
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION