EXPLAIN — فهم خطة الاستعلام
EXPLAIN SELECT * FROM users WHERE email = 'a@b.com';
مخرجات بسيطة:
Seq Scan on users (cost=0.00..12.00 rows=1 width=32)
Filter: (email = 'a@b.com'::text)
Seq Scan = مسح تسلسلي (Full Table Scan) — غير فعّال.
بعد إضافة فهرس:
EXPLAIN SELECT * FROM users WHERE email = 'a@b.com';
Index Scan using idx_users_email on users (cost=0.28..8.29 rows=1 width=32)
Index Scan = أسرع بكثير.
EXPLAIN ANALYZE
نفّذ الاستعلام فعلًا وأعرض الإحصائيات الحقيقية:
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders
WHERE created_at > '2025-01-01'
ORDER BY created_at DESC
LIMIT 100;
ابحث عن:
- Actual Time: وقت التنفيذ الحقيقي — أرقام مرتفعة = مشكلة.
- Rows vs Rows Removed by Filter: إذا أزيل عدد كبير من الصفوف، قد تحتاج فهرسًا أفضل.
- Buffers: عدد الصفحات المقروءة — أرقام مرتفعة = استهلاك ذاكرة كبير.
Slow Query Log في PostgreSQL
فعّل سجل الاستعلامات البطيئة في postgresql.conf:
log_min_duration_statement = 200 ; 200 مللي ثانية
log_line_prefix = '%t [%p]: '
log_statement = 'ddl'
ثم افحص السجل:
# في نظام Linux
tail -f /var/log/postgresql/postgresql-16-main.log
# ابحث عن الاستعلامات التي تجاوزت 200ms
grep "duration:" /var/log/postgresql/*.log
أدوات تحليل الأداء
| الأداة | الوظيفة |
|---|---|
pg_stat_statements | إحصائيات جميع الاستعلامات المنفّذة |
pgBadger | تقارير HTML من Slow Query Log |
pg_stat_user_indexes | مراقبة استخدام الفهارس |
EXPLAIN (ANALYZE, BUFFERS, TIMING) | التشخيص التفصيلي |
البحث عن الفهارس غير المستخدمة:
SELECT schemaname, tablename, indexname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0;
الفهارس غير المستخدمة تبطئ الكتابة دون فائدة — احذفها.
⚠️ قبل تحسين أي استعلام، قِس أولًا (EXPLAIN ANALYZE) — لا تحسّن على أساس التخمين.
🎯 الآن أكملت حزمة تحسين أداء SQL. عدّل أي استعلام بطيء في مشروعك باستخدام هذه الأدوات.