EXPLAIN ANALYZE — query plan o'qish, Seq Scan vs Index Scan

~25 daq · PostgreSQL · Index va Performance

So'rov sekin. Index qo'shilgan — lekin tezlashmadi. Sababi? PostgreSQL index ishlatmayapti. Nima uchun? Buni bilish uchun EXPLAIN ANALYZE kerak — so'rov nima qilayotganini ko'rish vositasi.


EXPLAIN — reja ko'rish

EXPLAIN SELECT * FROM foydalanuvchilar WHERE email = 'j@mail.com';
Seq Scan on foydalanuvchilar  (cost=0.00..18.50 rows=1 width=64)
  Filter: (email = 'j@mail.com')

Seq Scan — barcha qatorlar ketma-ket o'qilmoqda. Index ishlatilmayapti.


EXPLAIN ANALYZE — haqiqiy bajarish

EXPLAIN ANALYZE SELECT * FROM foydalanuvchilar WHERE email = 'j@mail.com';
Seq Scan on foydalanuvchilar
  (cost=0.00..18.50 rows=1 width=64)
  (actual time=0.045..2.341 rows=1 loops=1)
  Filter: (email = 'j@mail.com')
  Rows Removed by Filter: 999
Planning Time: 0.082 ms
Execution Time: 2.358 ms

EXPLAIN — reja (haqiqiy bajarmaydi). EXPLAIN ANALYZE — rejani bajaradi va haqiqiy vaqtni o'lchaydi.

[!WARNING] EXPLAIN ANALYZE so'rovni haqiqatan bajaradi — DELETE, UPDATE, INSERT bilan ishlatganda tranzaksiya ichida:

BEGIN;
EXPLAIN ANALYZE DELETE FROM jadval WHERE ...;
ROLLBACK;

Asosiy tushunchalar

cost

cost=0.00..18.50
      ↑      ↑
  boshlash  tugash

PostgreSQL ning ichki baholash birligi. Absolyut qiymat emas — solishtirish uchun.

rows

Taxminiy qaytariladigan qatorlar soni. Statistika (ANALYZE) eskirsa — noto'g'ri bo'lishi mumkin.

actual time

actual time=0.045..2.341

Haqiqiy vaqt (millisoniya). Birinchi — birinchi qatorga qadar, ikkinchi — barchasi.


Scan turlari

Seq Scan — ketma-ket o'qish

Seq Scan on foydalanuvchilar (cost=0.00..18.50 rows=1000)

Barcha qatorlar o'qiladi. Kichik jadvallarda yoki ko'p qator qaytarilganda tanlaydi.

Index Scan

Index Scan using idx_email on foydalanuvchilar (cost=0.29..8.31 rows=1)
  Index Cond: (email = 'j@mail.com')

Index orqali qator topiladi, keyin jadvaldan o'qiladi.

Index Only Scan

Index Only Scan using idx_email_covering on foydalanuvchilar

Covering index — jadvalga murojaat yo'q. Eng tez.

Bitmap Heap Scan

Bitmap Heap Scan on foydalanuvchilar
  Recheck Cond: (email = 'j@mail.com')
  ->  Bitmap Index Scan on idx_email

Ko'p qator qaytarilanda Index Scan dan samaraliroq.


Index ishlatilmay qolish sabablari

1. Jadval kichik — Seq Scan tezroq:

Seq Scan on kichik_jadval (rows=50)

50 qatorli jadvalda index qo'shish hech narsa bermaydi.

2. Ko'p qator qaytariladi:

-- Jadvalning 80% qaytarilsa — Seq Scan yaxshiroq
WHERE yosh > 5

3. Statistika eskirgan:

ANALYZE foydalanuvchilar; -- statistikani yangilash

4. Funksiya ichida ustun:

WHERE LOWER(email) = 'j@mail.com' -- oddiy index ishlamaydi

Tez-tez uchraydigan xatolar

EXPLAIN ni EXPLAIN ANALYZE deb o'ylash:

EXPLAIN haqiqiy bajarmaydi — vaqt ko'rsatmaydi. Haqiqiy vaqt uchun ANALYZE kerak.

Bir marta o'lchash:

-- Birinchi bajarilishda kesh sovuq bo'lishi mumkin
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
-- BUFFERS — kesh holati ko'rsatadi

Xulosa

EXPLAIN SELECT ...;               -- reja, bajarmaydi
EXPLAIN ANALYZE SELECT ...;       -- reja + haqiqiy vaqt
EXPLAIN (ANALYZE, BUFFERS) ...;   -- kesh holati bilan

Scan turlari (tezlikdan sekinlikka qarab):
  Index Only Scan  — covering index, jadvalga murojaat yo'q
  Index Scan       — index + jadval
  Bitmap Heap Scan — ko'p qator, index + jadval
  Seq Scan         — barcha qatorlar, index yo'q

Keyingi dars

40-dars: Query optimizatsiya — N+1, join strategiyalari, qoidalar