0Pricing
SQL Academy · درس

تحديد الاستعلامات البطيئة وإصلاحها

استخدم pg_stat_statements وlog_min_duration_statement وEXPLAIN للعثور على الاستعلامات البطيئة وتطبيق إصلاحات موجهة

تحديد الاستعلامات البطيئة وإصلاحها درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

الخطوة 1: اعثر على الاستعلامات البطيئة

لا تحسّن الأداء بشكل عشوائي. استخدم:

  • pg_stat_statements — أهم الاستعلامات حسب الزمن الإجمالي
  • log_min_duration_statement — تسجيل الاستعلامات التي تتجاوز حدًا معينًا
  • pgBadger — تقارير منسقة من السجلات

إعداد pg_stat_statements

فعّل الامتداد واضبط shared_preload_libraries:

-- postgresql.conf
shared_preload_libraries = 'pg_stat_statements'

-- After restart:
CREATE EXTENSION pg_stat_statements;

أثقل 10 استعلامات

أكثر استعلام مفيد لأي مسؤول قاعدة بيانات:

SELECT query,
       calls,
       total_exec_time,
       mean_exec_time,
       rows
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

سجّل الاستعلامات البطيئة

حدّد حدًا زمنيًا ثم اقرأ السجل:

-- postgresql.conf
log_min_duration_statement = '500ms'
-- All queries running > 500ms are logged.

الخطوة 2: أعد الإنتاج باستخدام EXPLAIN ANALYZE

لكل استعلام بطيء، شغّل EXPLAIN ANALYZE في بيئة مماثلة للبيئة الفعلية، باستخدام بيانات شبيهة ببيانات الإنتاج. انظر إلى:

  • العقدة ذات أكبر زمن فعلي
  • أكبر فرق بين الصفوف المقدّرة والفعلية
  • ما إذا كانت الفهارس المناسبة مستخدمة

الإصلاحات الشائعة

  • فهرس مفقود على عمود في WHERE أو JOIN
  • شرط غير قابل لاستخدام الفهرس، بسبب وجود دالة على العمود؛ أضف فهرسًا للتعبير أو أعد كتابة الاستعلام
  • إحصاءات قديمة؛ شغّل ANALYZE
  • نوع بيانات غير صحيح، ما يسبب تحويلًا ضمنيًا؛ أصلح نوع العمود
  • شروط OR؛ أعد كتابتها على شكل UNION لاستعلامات ذات شرط واحد
  • استخدام SELECT * لجلب بيانات كثيرة؛ قلّل الأعمدة المطلوبة

إحصاءات قديمة

إذا اختلف عدد الصفوف المقدّر كثيرًا عن العدد الفعلي، فشغّل ANALYZE أولًا:

ANALYZE orders;
-- Or rely on autovacuum to do it periodically.

فحص سلامة الفهارس

اعرض الفهارس الموجودة على جدول وأحجامها:

SELECT indexrelname, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
WHERE relname = 'orders'
ORDER BY pg_relation_size(indexrelid) DESC;

الفهارس غير المستخدمة

اعثر على الفهارس التي لا تُستخدم مطلقًا:

SELECT schemaname, relname, indexrelname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;
-- Consider dropping them — they slow writes for no read benefit.

التنافس على الأقفال

أحيانًا يكون الاستعلام "بطيئًا" لأنه ينتظر قفلًا. تحقّق من pg_stat_activity بحثًا عن wait_event:

SELECT pid, state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE state <> 'idle';

أنماط إعادة كتابة الاستعلامات

  • انقل عوامل التصفية إلى WHERE
  • استبدل الاستعلام الفرعي المترابط في SELECT باستخدام JOIN + GROUP BY
  • استبدل OR بـ UNION ALL لاستعلامات مفهرسة
  • استخدم دوال النوافذ بدلًا من عمليات الربط الذاتي
  • حقّق الاستعلامات الفرعية المتكررة باستخدام CTEs عندما يكون المخطط مرتبكًا

كرّر العملية

تحسين الأداء حلقة متكررة: قِس → ضع فرضية → غيّر → قِس. لا تعتمد على التخمين.

مراجعة

اعثر على الاستعلامات البطيئة باستخدام pg_stat_statements، وشخّصها باستخدام EXPLAIN ANALYZE، وأصلحها بالفهارس أو ANALYZE أو إعادة الكتابة، ثم كرّر العملية.

تحقق سريع

أي امتداد في PostgreSQL يعرض الاستعلامات التي تستغرق أطول وقت، مرتبة حسب إجمالي زمن التنفيذ؟

الأسئلة الشائعة

هل درس «تحديد الاستعلامات البطيئة وإصلاحها» مجاني؟

نعم — نص درس «تحديد الاستعلامات البطيئة وإصلاحها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «تحديد الاستعلامات البطيئة وإصلاحها»؟

استخدم pg_stat_statements وlog_min_duration_statement وEXPLAIN للعثور على الاستعلامات البطيئة وتطبيق إصلاحات موجهة تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «تحديد الاستعلامات البطيئة وإصلاحها»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. قراءة EXPLAIN وEXPLAIN ANALYZE
  2. الفحص التسلسلي مقابل فحص الفهرس
  3. Hash Join مقابل Merge Join مقابل Nested Loop
  4. تحديد الاستعلامات البطيئة وإصلاحها
← العودة إلى SQL Academy