PostgreSQL Performance & Query Optimization · درس

تحسين عمليات ربط LATERAL وعمليات البحث المترابطة

تعلّم كيف تتيح عمليات ربط LATERAL للاستعلام الفرعي الإشارة إلى أعمدة من جداول سابقة، وكيفية استخدامها لاستبدال الاستعلامات الفرعية المترابطة البطيئة بعمليات بحث فعّالة لكل صف

الدرس 4 من 413 خطوة

تحسين عمليات ربط LATERAL وعمليات البحث المترابطة درس مجاني في PostgreSQL Performance & Query Optimization على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PostgreSQL Performance & Query Optimization، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PostgreSQL Performance & Query Optimization 4 دروس في المجموع.

بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.

What is a LATERAL Join?

A LATERAL join lets a subquery in the FROM clause reference columns from tables listed before it. Without LATERAL, a subquery in FROM cannot see the outer rows.

The Problem It Solves

Suppose you want, for each customer, their three most recent orders. A plain join cannot easily limit rows per customer. LATERAL evaluates the subquery once per outer row, so a per-row LIMIT works.

Basic Syntax

Place LATERAL before the subquery and reference the outer table inside it.

SELECT c.name, o.id, o.total
FROM customers c
CROSS JOIN LATERAL (
  SELECT id, total
  FROM orders
  WHERE orders.customer_id = c.id
  ORDER BY created_at DESC
  LIMIT 3
) o;

LEFT JOIN LATERAL

Use LEFT JOIN LATERAL ... ON true when you still want outer rows that have no matching subquery results, such as customers with no orders.

SELECT c.name, o.id
FROM customers c
LEFT JOIN LATERAL (
  SELECT id FROM orders
  WHERE orders.customer_id = c.id
  ORDER BY created_at DESC LIMIT 1
) o ON true;

LATERAL vs Correlated Subquery

A correlated subquery in the SELECT list can only return one column per row. LATERAL can return multiple columns and multiple rows, making it far more flexible.

Indexing for LATERAL

Because the subquery runs once per outer row, the inner filter and sort must be index-backed. Create a composite index matching the WHERE and ORDER BY columns.

CREATE INDEX idx_orders_cust_created
ON orders (customer_id, created_at DESC);

Reading the Plan

A well-optimized LATERAL shows a Nested Loop with an Index Scan on the inner side. If you see a Seq Scan inside the loop, the supporting index is missing.

EXPLAIN ANALYZE
SELECT c.name, o.id
FROM customers c
CROSS JOIN LATERAL (
  SELECT id FROM orders
  WHERE orders.customer_id = c.id
  ORDER BY created_at DESC LIMIT 3
) o;

LATERAL with Set-Returning Functions

LATERAL also works with functions like unnest or jsonb_array_elements, expanding array columns per row.

SELECT p.id, tag
FROM products p
CROSS JOIN LATERAL unnest(p.tags) AS tag;

Top-N Per Group Pattern

The most common use of LATERAL is the top-N-per-group query. It is usually faster than window-function approaches when N is small and an index supports the order.

When to Avoid LATERAL

If the outer table is huge and the inner subquery has no supporting index, running it millions of times is slow. In that case a window function or a single aggregated join may win. Always measure both.

Passing Computed Values Forward

LATERAL can also compute an intermediate value and reuse it in later expressions, avoiding repeating the same calculation. Each LATERAL block sees the columns produced before it.

SELECT o.id, m.margin
FROM orders o
CROSS JOIN LATERAL (
  SELECT o.total - o.cost AS margin
) m
WHERE m.margin > 0;

Quick Check

Test your LATERAL knowledge.

Recap

You learned LATERAL joins:

  • They let a FROM-clause subquery see earlier tables' columns
  • Perfect for top-N-per-group and per-row lookups
  • Use LEFT JOIN LATERAL ... ON true to keep unmatched outer rows
  • Back the inner filter and sort with a composite index
  • Confirm a Nested Loop + Index Scan in the plan
البدء مجانًا

تعلم SQL مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
22
الدروس
88

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

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

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

ماذا ستتعلم في «تحسين عمليات ربط LATERAL وعمليات البحث المترابطة»؟

تعلّم كيف تتيح عمليات ربط LATERAL للاستعلام الفرعي الإشارة إلى أعمدة من جداول سابقة، وكيفية استخدامها لاستبدال الاستعلامات الفرعية المترابطة البطيئة بعمليات بحث فعّالة لكل صف تتمرن على PostgreSQL Performance & Query Optimization مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ PostgreSQL Performance & Query Optimization؟

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

كم من الوقت يستغرق درس «تحسين عمليات ربط LATERAL وعمليات البحث المترابطة»؟

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

هل يمكنني كتابة وتشغيل أكواد في درس PostgreSQL Performance & Query Optimization هذا؟

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

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

  1. فهم خوارزميات الربط
  2. إعادة كتابة عمليات الربط المعقدة
  3. الاستعلامات الفرعية مقابل CTE وعمليات الربط
  4. تحسين عمليات ربط LATERAL وعمليات البحث المترابطة
← العودة إلى PostgreSQL Performance & Query Optimization