Əgər EXPLAIN sənə kristal kürə verib göstərirsə ki, PostgreSQL sorğunu “planlaşdırır” necə icra edəcək, EXPLAIN ANALYZE səni əsl detektivə çevirir ki, əslində nə baş verdi onu öyrənəsən.
EXPLAIN və EXPLAIN ANALYZE arasındakı əsas fərqlər:
EXPLAIN – bu nəzəriyyədir, göstərir ki, PostgreSQL sorğunu necə icra etməyi planlaşdırır. Burda təxmini dəyərləri görürsən, məsələn, neçə sətir (rows) və icra dəyəri (cost).
EXPLAIN ANALYZE – bu isə praktikadır. PostgreSQL sorğunu həqiqətən icra edir və göstərir:
- Hər mərhələdə real işlənmiş sətirlərin sayını.
- Hər əməliyyatın real icra vaxtını.
- Planın təxminləri ilə müqayisəni (
rowsvəcost).
Məsələn: əgər sorğun planlaşdırır ki, 100 sətir işlənəcək, amma əslində 10 000 sətir işlənirsə, EXPLAIN ANALYZE bu “çirkli” faktı dərhal üzə çıxaracaq!
Əsas sintaksis və istifadə
EXPLAIN kimi, EXPLAIN ANALYZE-dan istifadə etmək çox asandır. Sadəcə EXPLAIN komandasına ANALYZE sözünü əlavə elə.
EXPLAIN ANALYZE
SELECT * FROM students WHERE age > 20;
PostgreSQL bunu edəcək:
- Sorğunu icra edir.
- Execution plan-da hər əməliyyatı, real göstəricilərlə birlikdə yazır.
- Sorğunun icra prosesinin tam təsvirini qaytarır.
EXPLAIN ANALYZE hansı məlumatları verir?
Əməliyyatların real icra vaxtı:
Actual Start Time: əməliyyat nə vaxt başladı.Actual End Time: əməliyyat nə vaxt bitdi.
Ümumi işlənmiş sətirlərin sayı:
Bu, planın təxminlərinin (rows dəyərləri) nə qədər düzgün olduğunu qiymətləndirməyə kömək edir.
Buffer-lar haqqında info:
Disk və yaddaş buffer-larının necə istifadə olunduğu barədə məlumat verir.
EXPLAIN ANALYZE-dan istifadə nümunəsi
Gəlin konkret nümunəyə baxaq. Bizdə students adlı cədvəl var, tələbələr haqqında məlumat saxlayır:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
age INTEGER,
grade FLOAT
);
INSERT INTO students (name, age, grade)
VALUES
('Alice', 22, 4.1),
('Bob', 19, 3.8),
('Charlie', 23, 4.5),
('Diana', 20, 3.9);
20 yaşdan böyük tələbələri çıxarmaq üçün sorğu icra edirik:
EXPLAIN ANALYZE
SELECT * FROM students WHERE age > 20;
Nümunə nəticə:
Seq Scan on students (cost=0.00..14.00 rows=2 width=116) (actual time=0.025..0.026 rows=2 loops=1)
Filter: (age > 20)
Rows Removed by Filter: 2
Planning Time: 0.032 ms
Execution Time: 0.048 ms
Nəticəni izah edək:
Seq Scan– PostgreSQL cədvəli ardıcıl (sequential) scan edir.cost=0.00..14.00– əməliyyatın təxmini dəyəri.rows=2– PostgreSQL gözləyir ki, sorğu 2 sətir qaytaracaq (və düz tapıb!).actual time=0.025..0.026– əməliyyatın real icra vaxtı (millisaniyə ilə).Rows Removed by Filter: 2– iki sətir filter-lə çıxarılıb, çünkiWHEREşərtinə uyğun gəlmirdi.
Nəzəriyyə və praktikanın müqayisəsi
Burda EXPLAIN ANALYZE-nın magiyasıdır: o göstərir ki, sorğu əslində necə icra olunub və bunu nəzəri execution plan-la müqayisə etməyə imkan verir.
Gəlin bir az daha mürəkkəb nümunəyə baxaq.
EXPLAIN ANALYZE
SELECT * FROM students WHERE age > 20 AND grade > 4.0;
Nümunə nəticə:
Seq Scan on students (cost=0.00..14.00 rows=1 width=116) (actual time=0.026..0.027 rows=1 loops=1)
Filter: ((age > 20) AND (grade > 4.0))
Rows Removed by Filter: 3
Planning Time: 0.035 ms
Execution Time: 0.057 ms
Nə görürük:
- PostgreSQL sorğunu 0.057 millisaniyəyə icra edib.
- Yalnız bir sətir (
rows=1)WHEREşərtlərinə uyğundur. - Üç sətir filter-lə çıxarılıb (
Rows Removed by Filter: 3).
Xülasə
EXPLAIN ANALYZE-dan istifadə bottleneck-ləri tapmağa və sorğuları necə optimallaşdırmaq lazım olduğunu başa düşməyə kömək edir. Məsələn:
- Əgər
Seq Scançox “ağır”dırsa, bəlkə də index əlavə etməyin vaxtıdır. - Əgər PostgreSQL-in təxminləri real datadan çox fərqlidirsə, cədvəlin statistikalarını (
ANALYZE) və ya index strukturunu yoxlamaq lazımdır.
GO TO FULL VERSION