Chuyển đến nội dung chính
Mô-đun 10 · Bài học 2 trong tổng số 438/57 trong khóa học~15 min
Bài học theo mô-đun (2/4)

GIẢI THÍCH và PHÂN TÍCH

Bạn đã bao giờ tự hỏi làm thế nào cơ sở dữ liệu chọn có sử dụng chỉ mục đẹp mà bạn vừa tạo không? Ngay sau khi bạn nhấn Enter trên một truy vấn (giả sử là tham gia lâu dài với một nhóm được liên kết), Công cụ lập kế hoạch truy vấn sẽ tính toán nhanh hàng chục chiến lược để thực hiện truy vấn và chọn một chiến lược được cho là nhanh nhất, theo lý thuyết.

Nhưng với tư cách là một nhà phát triển, bạn cần có khả năng nhìn vào bên trong tâm trí đen tối của Công cụ lập kế hoạch truy vấn.

GIẢI THÍCH

Để khám phá cách Người lập kế hoạch dự định tiến hành, chỉ cần đặt từ kỳ diệu EXPLAIN vào đầu truy vấn của bạn.

SQL
EXPLAIN SELECT * FROM orders WHERE status = 'delivered';

Kết quả sẽ không phải là mệnh lệnh! Thay vào đó, bạn sẽ thấy kế hoạch ở đầu ra (với số liệu thống kê ước tính):

Code
Seq Scan on orders  (cost=0.00..25.88 rows=15 width=40)
  Filter: (status = 'delivered'::text)

Điều này cho chúng ta biết:

  1. Người lập kế hoạch sẽ sử dụng Quét Seq (đọc tuần tự, thô bạo toàn bộ đĩa). Thật tệ nếu có hàng tỷ đơn đặt hàng.
  2. Nó ước tính ~15 hàng sẽ được trả về và tính toán "chi phí" trong các chu kỳ CPU được tải sẵn.

GIẢI THÍCH PHÂN TÍCH

Trong khi EXPLAIN dựa vào các dự đoán thuật toán (dựa trên số liệu thống kê toàn cầu được tính toán trong vài giờ qua trên dữ liệu), EXPLAIN ANALYZE thực sự chạy truy vấn thực (và chờ kết quả logic đầy đủ), so sánh thời gian thực đã trôi qua theo thuật ngữ tuyệt đối về mặt toán học.

SQL
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 90;
Code
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

Hoan hô! Tại đây, bạn biết rằng cơ sở dữ liệu đã quyết định áp dụng Quét chỉ mục trên chỉ mục idx_orders_cust phụ của chúng tôi, mất thời gian thực hiện cực nhỏ là một phần nghìn giây, bỏ qua hàng triệu hàng một cách nhanh chóng.

Đến lượt bạn

tập thể dục#sql.m10.l2.e1
Nỗ lực: 0Đang tải…

Viết lệnh GIẢI THÍCH cơ bản để khám phá cách PostgreSQL dự định tìm các sản phẩm có số lượng tồn kho hiện tại dưới 10 đơn vị. (Không sử dụng PHÂN TÍCH trong bước này.)

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Chỉ cần thêm từ GIẢI THÍCH vào đầu câu lệnh hiện có.

Giải pháp khả dụng sau 3 lần thử

Nhận số liệu trung thực

tập thể dục#sql.m10.l2.e2
Nỗ lực: 0Đang tải…

Chúng tôi muốn có một chẩn đoán hiệu suất thực tế (thời gian và chu kỳ), chứ không phải một bản phác thảo được đoán bằng toán học.\nHãy sử dụng câu lệnh chuyên dụng để nghiên cứu, bằng cách chạy nó trên thực tế, việc tra cứu TẤT CẢ 'khách hàng' đã đăng ký trước ngày 1 tháng 1 năm 2025 ('signed_up_on' < '2025-01-01').

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Thêm từ PHÂN TÍCH ngay sau GIẢI THÍCH.

Giải pháp khả dụng sau 3 lần thử