0Pricing
SQL Interview Prep · درس

CTE مقابل الاستعلام الفرعي مقابل الجدول المؤقت

المفاضلة بين التجسيد وإعادة الاستخدام وسلوك المحسّن

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

ثلاث طرق لتنظيم المنطق على مراحل

عندما يحتاج الاستعلام إلى نتيجة وسيطة، تتوفر لديك ثلاث أدوات شائعة: استعلام فرعي، وCTE، وجدول مؤقت. يطلب منك القائمون على المقابلات مقارنتها لأن اختيارك يكشف مدى فهمك للتخزين الفعلي وسلوك المُحسِّن.

يبني هذا الدرس إطارًا لاتخاذ القرار يمكنك ترديده تحت الضغط.

الاستعلام الفرعي

الاستعلام الفرعي هو استعلام مضمّن داخل استعلام آخر، وغالبًا ما يوجد في FROM أو WHERE أو SELECT. وهو جزء من العبارة نفسها، ويراه المُحسِّن كوحدة واحدة.

  • لا يحتاج إلى اسم، مع أن الجداول المشتقة تحتاج إلى اسم مستعار.
  • يتمتع المُحسِّن بحرية دمجه في الاستعلام الخارجي.
  • يصبح مطولًا وصعب القراءة عند تداخله بعمق.
SELECT *
FROM (
    SELECT customer_id, SUM(amount) AS total
    FROM orders
    GROUP BY customer_id
) t
WHERE t.total > 1000;

CTE

CTE هي استعلام فرعي مُسمّى داخل كتلة WITH، ويقتصر نطاقها على عبارة واحدة. وتُقرأ بصورة أفضل من الاستعلام الفرعي شديد التداخل، كما يمكن الإشارة إليها عدة مرات.

  • هي مُسمّاة، لذلك يكون الغرض منها موثقًا.
  • يمكن الإشارة إليها أكثر من مرة في العبارة نفسها.
  • يبقى نطاقها مقتصرًا على عبارة واحدة، ثم تختفي.
WITH spend AS (
    SELECT customer_id, SUM(amount) AS total
    FROM orders
    GROUP BY customer_id
)
SELECT *
FROM spend
WHERE total > 1000;

الجدول المؤقت

الجدول المؤقت هو جدول فعلي ومادي يستمر طوال الجلسة (أو المعاملة). تملؤه بعبارة واحدة، ثم تستعلم منه في عبارات لاحقة منفصلة.

  • يستمر عبر عدة عبارات ضمن الجلسة.
  • يمكن إنشاء فهارس له وجمع الإحصاءات عنه.
  • يتطلب عمليات إدخال وإخراج إلى القرص وتنظيفًا صريحًا.
CREATE TEMP TABLE spend AS
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id;

SELECT * FROM spend WHERE total > 1000;

التخزين الفعلي: الفرق الأساسي

المفهوم الأساسي الذي يستكشفه القائمون على المقابلات هو التخزين الفعلي: أي ما إذا كانت النتيجة الوسيطة تُكتب فعليًا في مكان ما.

  • عادةً لا تُخزَّن الاستعلامات الفرعية وCTEs فعليًا؛ فكثيرًا ما يدمجها المُحسِّن مباشرةً في الخطة.
  • أما الجدول المؤقت، فيُخزَّن فعليًا دائمًا.
  • تتيح بعض قواعد البيانات فرض تخزين CTEs فعليًا أو منعه باستخدام التلميحات.

حواجز التحسين وفخ Postgres القديم

تاريخيًا، كان PostgreSQL يتعامل مع كل CTE باعتبارها حاجزًا للتحسين، فيخزّنها فعليًا ويمنع دفع الشروط إلى الجداول الأساسية. ومنذ Postgres 12، تُدمج CTEs البسيطة غير التكرارية المشار إليها مرة واحدة مباشرةً في الخطة افتراضيًا، مع تلميحي MATERIALIZED وNOT MATERIALIZED لتجاوز هذا السلوك.

إن ذكر هذه النقطة الدقيقة مؤشر قوي على الخبرة المتقدمة.

WITH spend AS NOT MATERIALIZED (
    SELECT customer_id, SUM(amount) AS total
    FROM orders GROUP BY customer_id
)
SELECT * FROM spend WHERE total > 1000;

إعادة الاستخدام ضمن عبارة واحدة

إذا أشرت إلى النتيجة الوسيطة نفسها عدة مرات في عبارة واحدة، فقد تكون CTE أوضح من تكرار استعلام فرعي. لكن انتبه: قد يُعاد حساب CTE المدمجة مباشرةً عند كل إشارة إليها.

عندما تكون إعادة الحساب مكلفة، فإن فرض التخزين الفعلي (أو استخدام جدول مؤقت) يتجنب تنفيذ العمل مرتين.

إعادة الاستخدام عبر العبارات

تعيش CTEs والاستعلامات الفرعية ضمن عبارة واحدة فقط. وإذا احتجت إلى النتيجة نفسها في عدة استعلامات منفصلة، فالجدول المؤقت هو الأداة المناسبة.

ومن الحالات المعتادة عملية ETL متعددة الخطوات أو تقرير تبني فيه مجموعة تجهيز مرة واحدة، ثم تجري عدة تحليلات عليها. ويمكن لفهرسة الجدول المؤقت بعد ذلك تسريع كل استعلام لاحق.

الفهرسة والإحصاءات

الجدول المؤقت وحده يمكنه الاحتفاظ بالفهارس والإحصاءات الحديثة. وبالنسبة إلى مجموعة وسيطة ضخمة تُضم مرات عديدة، قد يكون ذلك حاسمًا.

  • CTE/الاستعلام الفرعي: يقدّر المُحسِّن النتائج اعتمادًا على الجداول الأساسية.
  • الجدول المؤقت: يمكنك تنفيذ ANALYZE عليه وإضافة فهارس مضبوطة لعمليات الضم اللاحقة.

لذلك، قد يتفوق الجدول المؤقت في الأداء مع النتائج الكبيرة كثيرة إعادة الاستخدام، رغم الخطوات الإضافية.

إطار اتخاذ القرار

إجابة واضحة في المقابلة:

  • الاستعلام الفرعي: استخدام لمرة واحدة، وتداخل بسيط، وقابلية القراءة مناسبة.
  • CTE: تحسّن قابلية القراءة أو تحتاج إلى الإشارة إليها عدة مرات في عبارة واحدة.
  • الجدول المؤقت: يُعاد استخدامه عبر عدة عبارات، أو تكون النتيجة كبيرة جدًا، أو تحتاج إلى فهارس وإحصاءات.

ابدأ افتراضيًا باستخدام CTE من أجل الوضوح، والجأ إلى الجدول المؤقت عندما يكون التخزين الفعلي أو إعادة الاستخدام عبر العبارات مفيدًا فعلًا.

كيفية عرض المفاضلة

تجنب العبارات المطلقة مثل "CTEs أبطأ دائمًا". وقل بدلًا من ذلك: تُدمج CTEs والاستعلامات الفرعية عادةً مباشرةً في الخطة، لذا فهي تتعلق بقابلية القراءة؛ أما الجدول المؤقت فيُخزَّن فعليًا، ويستحق استخدامه عندما أعيد استخدام نتيجة كبيرة عبر عدة عبارات أو أحتاج إلى فهرس.

إن إقرارك بأن هذا السلوك يختلف باختلاف المحرك (وباختلاف الإصدار في Postgres) يُظهر فهمًا عميقًا حقيقيًا.

تحقق سريع

اختر الحالة التي يكون فيها الجدول المؤقت الخيار الأفضل بوضوح.

مراجعة: CTE مقابل الاستعلام الفرعي مقابل الجدول المؤقت

يعتمد الاختيار على التخزين الفعلي والنطاق.

  • الاستعلامات الفرعية وCTEs: تُدمج عادةً مباشرةً في الخطة، ويقتصر نطاقها على عبارة واحدة، ويُختار استخدامها من أجل قابلية القراءة.
  • تضيف CTEs التسمية وإعادة الاستخدام ضمن العبارة.
  • الجداول المؤقتة: تُخزَّن فعليًا دائمًا، وتستمر عبر العبارات، ويمكن فهرستها.
  • يُدمج Postgres 12+‏ CTEs البسيطة مباشرةً في الخطة؛ استخدم تلميحات MATERIALIZED للتحكم في ذلك.

التالي: إعادة هيكلة استعلام متداخل ومتشابك إلى CTEs واضحة.

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

هل درس «CTE مقابل الاستعلام الفرعي مقابل الجدول المؤقت» مجاني؟

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

ماذا ستتعلم في «CTE مقابل الاستعلام الفرعي مقابل الجدول المؤقت»؟

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

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

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

كم من الوقت يستغرق درس «CTE مقابل الاستعلام الفرعي مقابل الجدول المؤقت»؟

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

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

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

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

  1. كتابة أول CTE لك
  2. تسلسل عدة CTEs
  3. CTE مقابل الاستعلام الفرعي مقابل الجدول المؤقت
  4. إعادة هيكلة الاستعلامات المتداخلة إلى CTEs
← العودة إلى SQL Interview Prep