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.
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):
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:
- 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.
- 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.
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 msHoan 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
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.)
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
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').
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ử