select count(distinct user)
from some_table;
Truy vấn này thực hiện đếm trên bản đồ. Mỗi người lập bản đồ phát ra một giá trị, số đếm. Sau đó, tất cả các giá trị phải được tổng hợp để tạo ra tổng số, và đó là công việc của một bộ giảm tốc duy nhất.
select count(*) from
(select user
from some_table
group by user) q;
Truy vấn này có hai giai đoạn. Ở giai đoạn 1, GROUP BY tổng hợp người dùng ở phía bản đồ và phát ra một giá trị cho mỗi người dùng. Đầu ra phải được tổng hợp sau đó trên mặt giảm, nhưng nó có thể sử dụng nhiều bộ giảm. Ở giai đoạn 2, COUNT
được thực hiện, ở phía bản đồ, và sau đó kết quả cuối cùng được tổng hợp bằng một bộ giảm tốc duy nhất.
Vì vậy, nếu bạn có số lượng lớn các phần tách bên bản đồ thì truy vấn đầu tiên sẽ phải tổng hợp một số lượng rất lớn của một kết quả giá trị. Truy vấn thứ hai có thể sử dụng nhiều bộ giảm ở phía giảm của giai đoạn 1 và sau đó, ở giai đoạn 2, sẽ có một nhiệm vụ nhỏ hơn cho bộ giảm tốc đơn lẻ ở cuối.
Điều này thường không phải là tối ưu hóa. Bạn sẽ phải có một số lượng đáng kể các phần tách bản đồ cho bộ giảm truy vấn 1 để trở thành một vấn đề. Truy vấn thứ hai có hai giai đoạn và điều đó một mình sẽ chậm hơn truy vấn 1 (giai đoạn 2 không thể bắt đầu cho đến khi giai đoạn 1 được thực hiện hoàn toàn). Vì vậy, trong khi tôi có thể thấy một số lý do cho lời khuyên bạn nhận được, tôi sẽ hoài nghi trừ khi việc đo lường thích hợp được thực hiện và cho thấy sự cải thiện.
Nguồn
2013-10-11 09:20:32
Tôi không hiểu câu hỏi của bạn. Bạn có hỏi tại sao phiên bản 'by by' nhanh hơn không? Nếu có, thì tại sao bạn tin rằng nó nhanh hơn? Bạn đọc nó ở đâu đó hoặc bạn thấy nó hoạt động theo cách đó? –
chỉ cần sử dụng GIẢI THÍCH – Bohdan