0Pricing
PostgreSQL Performance & Query Optimization · 课时

了解连接算法

探索 PostgreSQL 如何执行不同的连接类型:嵌套循环、哈希连接和合并连接。

了解连接算法 是 CoddyKit 上的免费 PostgreSQL Performance & Query Optimization 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PostgreSQL Performance & Query Optimization 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PostgreSQL Performance & Query Optimization 课程共包含 4 节课。

本课时的部分内容尚未翻译,以英文显示。

Joins: Connecting Data

Welcome to understanding PostgreSQL join algorithms! Joins are fundamental for combining data from multiple tables.

They allow you to retrieve related information that is spread across your database schema, forming a complete picture.

Beyond Basic Joins

When you write a JOIN clause, PostgreSQL doesn't just pick one way to execute it. It has several powerful algorithms at its disposal.

The database's query planner chooses the most efficient algorithm based on factors like table size, available indexes, and data distribution.

Nested Loop Join Basics

The Nested Loop Join (NLJ) is the simplest algorithm. It works like a nested 'for' loop:

  • For each row in the outer table...
  • It scans the inner table for matching rows.

NLJ is efficient for small datasets or when the inner table's join column is indexed, allowing quick lookups.

NLJ in Action

Consider joining a small users table with a user_details table. If user_details.user_id is indexed, NLJ can be very fast.

Try creating and joining these tables:

CREATE TABLE users (user_id INT PRIMARY KEY, name VARCHAR(50));
CREATE TABLE user_details (detail_id INT PRIMARY KEY, user_id INT, address VARCHAR(100));

INSERT INTO users VALUES (1, 'Alice'), (2, 'Bob');
INSERT INTO user_details VALUES (101, 1, '123 Main St'), (102, 2, '456 Oak Ave');

SELECT u.name, ud.address
FROM users u
JOIN user_details ud ON u.user_id = ud.user_id;

Hash Join: Faster Matches

Hash Join is often chosen for larger, unsorted tables, especially with equality (=) join conditions. It works in two phases:

  1. Build Phase: PostgreSQL scans the smaller (or estimated smaller) table and builds an in-memory hash table using the join key.
  2. Probe Phase: It scans the larger table, hashes each row's join key, and probes the hash table for matches.

This method is very effective when enough memory is available for the hash table.

Hash Join Scenario

Imagine joining two large tables, products and sales, on their product_id. If neither table is sorted or indexed on product_id, a Hash Join is a strong candidate.

The planner will likely choose Hash Join for this query:

CREATE TABLE products (product_id INT PRIMARY KEY, name VARCHAR(50));
CREATE TABLE sales (sale_id INT PRIMARY KEY, product_id INT, quantity INT);

INSERT INTO products VALUES (1, 'Laptop'), (2, 'Mouse');
INSERT INTO sales VALUES (1001, 1, 2), (1002, 2, 1), (1003, 1, 3);

SELECT p.name, s.quantity
FROM products p
JOIN sales s ON p.product_id = s.product_id;

Merge Join: Sorted Efficiency

The Merge Join is highly efficient when both tables are already sorted on their join keys, or can be sorted cheaply. It also works in phases:

  1. Sort Phase: If not already sorted, both tables are sorted on their join columns.
  2. Merge Phase: PostgreSQL simultaneously scans both sorted tables, merging matching rows. It's like merging two sorted lists.

This is beneficial for range joins or when data is retrieved in sorted order.

Merge Join Use Case

If you're joining two tables, employees and departments, and both are indexed (and thus often sorted) on their respective ID columns, or if your query involves an ORDER BY on the join key, a Merge Join can be optimal.

PostgreSQL might use Merge Join here:

CREATE TABLE employees (emp_id INT PRIMARY KEY, dept_id INT, name VARCHAR(50));
CREATE TABLE departments (dept_id INT PRIMARY KEY, dept_name VARCHAR(50));

INSERT INTO employees VALUES (1, 10, 'John'), (2, 20, 'Jane');
INSERT INTO departments VALUES (10, 'HR'), (20, 'IT');

SELECT e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
ORDER BY e.emp_id;

PostgreSQL's Decisions

The PostgreSQL query planner uses a cost-based optimizer to decide which join algorithm to use. It estimates the cost of each possible plan based on:

  • Table and index statistics
  • Available memory (work_mem)
  • Join condition type (e.g., equality, range)
  • Estimated row counts

Using EXPLAIN is crucial to see which algorithm the planner chose!

Algorithm Challenge

You need to join two very large tables, customers and orders, on customer_id. There are no indexes on customer_id in either table, and the data is unsorted. Which join algorithm is PostgreSQL most likely to choose for optimal performance?

Join Algorithms: Key Takeaways

In this lesson, you explored the three primary join algorithms PostgreSQL uses:

  • Nested Loop Join: Simple, good for small sets or indexed inner tables.
  • Hash Join: Efficient for large, unsorted tables with equality joins, using a hash table.
  • Merge Join: Best when tables are already sorted on join keys or can be sorted cheaply.

Understanding these helps you interpret EXPLAIN plans and write more performant queries. Next, we'll look at rewriting complex joins!

常见问题解答

「了解连接算法」课时是免费的吗?

是的 — 「了解连接算法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PostgreSQL Performance & Query Optimization 课程的其余内容,请升级到 CoddyKit PRO。 PostgreSQL Performance & Query Optimization 课程共包含 4 节课。

「了解连接算法」这节课中我会学到什么?

探索 PostgreSQL 如何执行不同的连接类型:嵌套循环、哈希连接和合并连接。 你通过在浏览器中直接运行的动手代码来练习 PostgreSQL Performance & Query Optimization,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 PostgreSQL Performance & Query Optimization 需要有经验吗?

无需任何先前经验。CoddyKit 上的 PostgreSQL Performance & Query Optimization 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「了解连接算法」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 PostgreSQL Performance & Query Optimization 课中编写并运行代码吗?

能。每节 PostgreSQL Performance & Query Optimization 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 了解连接算法
  2. 重写复杂连接
  3. 子查询、CTE 与连接的比较
  4. 优化 LATERAL 连接与相关查找
← 返回 PostgreSQL Performance & Query Optimization