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:
- Yavaş sorğuları izləmək.
- Hansı sorğunun neçə dəfə işlədiyini başa düşmək.
- Onların nə qədər vaxt apardığını bilmək.
- Sorğunun orta işləmə vaxtını görmək.
- 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ı
- İ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);
- 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:
- Extension aktiv deyil. Əgər
pg_stat_statements-ishared_preload_libraries-ə əlavə etməyi unutsan, statistika toplanmayacaq. - İ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.
- 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.
GO TO FULL VERSION