Postgresql də performans artırılmasında əsas anlayışlar

Postgresqldə performans ,optimizasiya vs digər əməliyyatlar edərkən əsasən aşagıdakı anlayışlara rast gəlirik .

Postgresql də performans artırılmasında əsas anlayışlar

Postgresqldə performans ,optimizasiya vs digər əməliyyatlar edərkən əsasən aşagıdakı anlayışlara rast gəlirik .


1. XMIN və XMAX

PostgreSQL-də hər bir sətir (tuple) iki dəyər daşıyır: xminxmax.
Bunlar, sətirin hansı transaction tərəfindən yaradıldığını və hansı transaction tərəfindən dəyişdirildiyini göstərir.

  • xmin — sətiri yaradan və ya ilk dəfə dəyişdirən əməliyyatın ID-sidir.
  • xmax — sətiri silən və ya dəyişdirən əməliyyatın ID-sidir.

Yeni sətir əlavə olunanda xmin təyin edilir, xmax isə 0 olur.

| Əməliyyat | xmin | xmax | Qeyd                                                     | 
| --------- | ---- | ---- | -------------------------------------------------------- | 
| INSERT    | 5    | 0    | Yeni sətir əlavə olundu                                  | 
| UPDATE    | 5    | 7    | Köhnə sətir silindi (ölü sətir oldu), yeni sətir yarandı | 
| DELETE    | 5    | 7    | Sətir silindi, amma fiziki olaraq qalmışdır              |

Yəni, PostgreSQL-də heç bir sətir dərhal silinmir — sadəcə “silinmiş kimi işarələnir”.
Köhnə tuple-lar “ölü sətirlər” (dead tuples) adlanır və yaddaşda qalır.

CREATE TABLE   test_vacuum(id   SERIAL PRIMARY KEY , 
        name TEXT 
        ); 
 
INSERT INTO   test_vacuum(name) 
VALUES     ('A'),('B'),('C');

Indi o cədvəldən xmin xmax dəyərlərinin nə olduguna baxaq(iki fərli yolla göstərmişəm) :

CREATE EXTENSION IF NOT EXISTS pageinspect; 
SELECT lp, lp_flags, t_xmin, t_xmax, t_ctid, t_data 
FROM heap_page_items(get_raw_page('test_vacuum', 0));

2. Ölü Sətirlər və VACUUM Prosesi

Cədvəldə çoxlu UPDATEDELETE əməliyyatları baş verdikdə, bu ölü sətirlər yığılır və yaddaşı doldurur.
Onları təmizləmək üçün VACUUM əməliyyatı icra olunur.

VACUUM:

  • Ölü tuple-ları təmizləyir,
  • Diskdəki boşluqları qeyd edir,
  • Görünürlük məlumatlarını yeniləyir(Visibility-Map),
  • Transaction ID-lərin çevrəsini (wraparound) idarə edir.

Əgər bu proses avtomatik baş versin deyirsinizsə, autovacuum aktiv olmalıdır.n_dead_tup ölmüş sətirləri göstərir:

SELECT         relname, 
               n_live_tup, 
               n_dead_tup, 
               last_vacuum, 
               last_autovacuum, 
               vacuum_count, 
               autovacuum_count 
FROM           pg_stat_user_tables 
WHERE          relname = 'test_vacuum'; 
 
SELECT         xmin,xmax,ctid,* 
FROM           test_vacuum;

3. Visibility Map (VM)

Visibility Map — PostgreSQL-in daxili faylıdır. Hər cədvəlin bir VM faylı olur.
Bu xəritə hər bir səhifə (page) haqqında iki əsas bit saxlayır:

| Bit | Adı             | İzah                                                                    | 
| --- | --------------- | ----------------------------------------------------------------------- | 
| 1   | **All Visible** | Səhifədəki bütün tuple-lar hamı üçün görünəndir                         | 
| 2   | **All Frozen**  | Səhifədəki bütün tuple-ların transaction ID-ləri "frozen" vəziyyətdədir |

Bu xəritə VACUUM və ANALYZE kimi əməliyyatlarda vacibdir, çünki PostgreSQL həmin səhifələri oxumağa ehtiyac duymur.
Beləcə, VACUUM əməliyyatı daha sürətli olur və disk oxunuşları azalır.


4. Free Space Map (FSM)

Free Space Map — səhifələrdə nə qədər boşluq olduğunu saxlayan bir fayldır.
VACUUM əməliyyatı zamanı bu məlumat yenilənir.
FSM PostgreSQL-in hansı səhifədə yeni tuple yazacağını müəyyən etməsinə kömək edir.


5. Transaction ID və Wraparound problemi

PostgreSQL-də hər transaction-a 32-bitlik bir ID verilir.
Bu o deməkdir ki, müəyyən saydan sonra ID-lər “dönür” (wraparound).
Əgər köhnə tuple-lar vaxtında “freeze” edilməzsə, PostgreSQL onları yenidən görünən hesab edə bilər — yəni məlumat “korlanır”.

VACUUM bu problemi aradan qaldırmaq üçün:

  • Köhnə tuple-ların xminxmax dəyərlərini yoxlayır,
  • Onları frozen kimi işarələyir,
  • Beləcə wraparound baş vermir.

6. VACUUM və VACUUM FULL

  • VACUUM — ölü sətirləri təmizləyir, amma cədvəlin fiziki ölçüsünü kiçiltmir.
  • VACUUM FULL — cədvəli sıxır (rebuild edir), yəni diskdə faktiki boşluğu azaldır.
    Lakin bu əməliyyat Exclusive Lock tələb edir — yəni cədvəl bu vaxt ərzində bloklanır.

7. Autovacuum və Konfiqurasiya Parametrləri

Autovacuum PostgreSQL tərəfindən avtomatik icra olunan VACUUM prosesidir.
Əsas parametrlər:

  • autovacuum = on — autovacuum aktiv olmalıdır.
  • autovacuum_naptime — autovacuum-un işləmə intervalı (məs: 1 dəqiqə).(autovacuume launcher)
  • autovacuum_vacuum_threshold — neçə ölü sətir olduqda vakum başlasın.
  • maintenance_work_mem — VACUUM, CREATE INDEX, ALTER TABLE kimi əməliyyatlarda istifadə olunan RAM limiti.

8. Planer və Statistikalar

Sorğuların optimallaşdırılması zamanı PostgreSQL planer modulundan istifadə edir.
Planer statistik məlumatları aşağıdakı sistem tablolarından oxuyur:

  • pg_class
  • pg_statistic
  • real page məlumatları

Planer bu statistikalar əsasında index scanseq scan arasında qərar verir(Birdə Bitmap scan).
Yəni hansı üsul “daha ucuz” başa gəlirsə, PostgreSQL onu seçir.

  1. Seq scan — Bütün cədvəli düz oxuyur.yavaşdır.
  2. İndex scan — İndexlərlə random oxuma edir .
  3. Bitmap scan — İndexlənmiş random sahələri yığıb birlikdə oxuyur.

VACUUM PostgreSQL-də performans və məlumatın sağlamlığı üçün həyati əhəmiyyətə malikdir.
O:

  • Ölü sətirləri təmizləyir,
  • Diskdəki boşluqları idarə edir,
  • Görünürlük xəritələrini yeniləyir,
  • Transaction ID wraparound-un qarşısını alır.

9. REINDEXING

Zamanla PostgreSQL-də INSERT, UPDATE, və DELETE əməliyyatları nəticəsində indekslər parçalanır (fragmentation).
Bu, indeksin logical sıralaması ilə fiziki diskdəki sıralamanın fərqli olmasına səbəb olur.

Nəticədə:

  • Diskdə boş səhifələr yaranır
  • İndeks ölçüsü böyüyür.
  • İ/O əməliyyatları çoxalır
  • Sorğuların performansı aşağı düşür

Bu vəziyyəti düzəltmək üçün REINDEX əməliyyatı icra olunur.

REINDEX prosesi nə edir?

REINDEX əməliyyatı:

  1. Mövcud indeksin strukturunu tamamilə yenidən qurur
  2. Boş və lazımsız sahələri silir
  3. İndeksi kompaktlaşdırır (fiziki sıxılma)
  4. Ən optimal disk düzülüşünü bərpa edir

Spesifik bir indexi yenidən qurmaq üçün:

REINDEX INDEX tel_index;

Tam cədvəl üzrə :

REINDEX TABLE test_index;

Bütün verilənlər bazasında etmək üçün :

REINDEX DATABASE test_db;