دروس الوحدة (2/4)
اشرح وحلل
هل سبق لك أن تساءلت كيف تختار قاعدة البيانات ما إذا كانت ستستخدم هذا الفهرس الجميل الذي أنشأته للتو؟ بمجرد الضغط على Enter في استعلام (على سبيل المثال، صلة طويلة بمجموعة متسلسلة)، يحسب مخطط الاستعلامات العشرات من الاستراتيجيات بسرعة لتنفيذ الاستعلام ويختار الإستراتيجية التي يعتقد، من الناحية النظرية، أنها الأسرع.
ولكن كمطور، يجب أن تكون قادرًا على النظر داخل العقل المظلم لمخطط الاستعلامات.
يشرح
لاكتشاف كيف ينوي Planner المضي قدمًا، ما عليك سوى وضع الكلمة السحرية EXPLAIN في بداية الاستعلام الخاص بك.
EXPLAIN SELECT * FROM orders WHERE status = 'delivered';النتيجة لن تكون الأوامر! بدلاً من ذلك، سترى الخطة في المخرجات (مع الإحصائيات المقدرة):
Seq Scan on orders (cost=0.00..25.88 rows=15 width=40)
Filter: (status = 'delivered'::text)هذا يخبرنا:
- سيستخدم المخطط Seq Scan (القراءة المتسلسلة الغاشمة للقرص بأكمله). سيء إذا كان هناك مليارات الطلبات.
- يقدر أنه سيتم إرجاع 15 صفًا تقريبًا، ويحسب "التكلفة" في دورات وحدة المعالجة المركزية المحملة مسبقًا.
اشرح التحليل
بينما يعتمد EXPLAIN على التخمينات الخوارزمية (استنادًا إلى الإحصائيات العالمية المحسوبة في الساعات القليلة الماضية عبر البيانات)، EXPLAIN ANALYZE في الواقع يقوم بتشغيل الاستعلام بشكل حقيقي (وينتظر النتائج المنطقية الكاملة)، ويقارن الوقت الحقيقي المنقضي من حيث القيمة المطلقة رياضيًا.
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 90;Index Scan using idx_orders_cust on orders (cost=0.15..8.13 rows=4 width=40) (actual time=0.012..0.015 rows=4 loops=1)
Index Cond: (customer_id = 90)
Planning Time: 0.081 ms
Execution Time: 0.033 msمرحا! تعلم هنا أن قاعدة البيانات قررت تطبيق مسح الفهرس على فهرسنا الثانوي idx_orders_cust، مع تنفيذ وقت مجهري يصل إلى جزء من الألف من الثانية، وتخطي ملايين الصفوف بسرعة.
دورك
اكتب أمرًا EXPLAIN أساسيًا لتكتشف كيف تنوي PostgreSQL العثور على منتجات ذات مخزون حالي أقل من 10 وحدات. (لا تستخدم ANALYZE في هذه الخطوة.)
إظهار التلميح
ما عليك سوى إضافة كلمة "شرح" في بداية العبارة الموجودة.
الحل متاح بعد 3 من المحاولات
الحصول على مقاييس صادقة
نريد تشخيصًا حقيقيًا للأداء (التوقيتات والدورات)، وليس رسمًا تخطيطيًا تم تخمينه رياضيًا.\nاستخدم البيان المخصص للدراسة، من خلال تشغيله فعليًا، البحث عن جميع "العملاء" المسجلين قبل الأول من يناير 2025 ("signed_up_on" < '2025-01-01').
إظهار التلميح
أضف كلمة تحليل مباشرة بعد الشرح.
الحل متاح بعد 3 من المحاولات