EXPLAIN ANALYZE — query plan o'qish, Seq Scan vs Index Scan
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 ANALYZEso'rovni haqiqatan bajaradi —DELETE,UPDATE,INSERTbilan 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