تخطَّ إلى المحتوى

🗄️ شرح SQL وقواعد البيانات

تحليل الأداء (EXPLAIN و Slow Query Log)

الدرس 29 من 29· ⏱ 2 دقائق قراءة

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. عدّل أي استعلام بطيء في مشروعك باستخدام هذه الأدوات.

شرح تحليل الأداء (EXPLAIN و Slow Query Log) — SQL وقواعد البيانات بالعربي
تحليل الأداء (EXPLAIN و Slow Query Log)SQL وقواعد البيانات بالعربي · The Code Fix

📚 لمزيد من التعمّق في SQL وقواعد البيانات، راجِع توثيق SQL في PostgreSQL.

هل كان هذا الدرس مفيدًا؟