2009-07-10 24 views

Trả lời

60

Tham gia "sắp xếp hợp nhất" được thực hiện bằng cách sắp xếp hai tập dữ liệu được nối theo các phím nối và sau đó hợp nhất chúng với nhau. Việc hợp nhất là rất rẻ, nhưng loại có thể cực kỳ đắt tiền, đặc biệt là nếu sắp xếp tràn vào đĩa. Chi phí sắp xếp có thể được hạ xuống nếu một trong các tập dữ liệu có thể được truy cập theo thứ tự sắp xếp thông qua chỉ mục, mặc dù việc truy cập một tỷ lệ cao khối bảng thông qua quét chỉ mục cũng có thể rất tốn kém so với quét toàn bộ bảng .

Tham gia băm được thực hiện bằng cách băm một bộ dữ liệu vào bộ nhớ dựa trên các cột nối và đọc một bộ dữ liệu khác và thăm dò bảng băm cho phù hợp. Việc băm tham gia là chi phí rất thấp khi bảng băm có thể được tổ chức hoàn toàn trong bộ nhớ, với tổng chi phí lên đến rất ít hơn chi phí đọc các tập dữ liệu. Chi phí tăng lên nếu bảng băm phải được đổ vào đĩa theo kiểu một lần và tăng đáng kể cho một loại phân loại.

Chi phí của phép nối băm có thể được giảm bằng cách phân vùng cả hai bảng trên (các) khóa kết nối. Điều này cho phép trình tối ưu hóa suy ra rằng các hàng từ một phân vùng trong một bảng sẽ chỉ tìm thấy một kết quả phù hợp trong một phân vùng cụ thể của bảng khác, và đối với các bảng có phân vùng n thì phép nối băm được thực thi như là các phép nối băm độc lập. Điều này có các hiệu ứng sau:

  1. Kích thước của mỗi bảng băm được giảm xuống, do đó giảm tối đa bộ nhớ cần thiết và có khả năng loại bỏ yêu cầu hoạt động để yêu cầu không gian đĩa tạm thời.
  2. Đối với hoạt động truy vấn song song, số lượng tin nhắn liên tiến trình giảm đáng kể, giảm mức sử dụng CPU và cải thiện hiệu suất, vì mỗi phép nối băm có thể được thực hiện bởi một cặp quy trình PQ.
  3. Đối với các hoạt động truy vấn không song song, yêu cầu bộ nhớ được giảm theo hệ số n và các hàng đầu tiên được chiếu từ truy vấn trước đó.

Bạn nên lưu ý rằng các phép nối băm chỉ có thể được sử dụng để tham gia equi, nhưng hợp nhất các kết nối linh hoạt hơn.

Nói chung, nếu bạn đang tham gia một lượng lớn dữ liệu trong một tham gia equi thì việc kết hợp băm sẽ là đặt cược tốt hơn.

Chủ đề này được trình bày rất rõ trong tài liệu.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523

6

Tôi chỉ muốn chỉnh sửa điều này vì hậu thế là các thẻ cho oracle không được thêm khi tôi trả lời câu hỏi này. Câu trả lời của tôi đã được áp dụng nhiều hơn cho MS SQL.

Kết hợp hợp nhất là tốt nhất có thể khi nó khai thác thứ tự, dẫn đến một lần truyền xuống các bảng để thực hiện phép nối. NẾU bạn có hai bảng (hoặc bao gồm các chỉ mục) có thứ tự giống nhau như khóa chính và chỉ mục của một bảng trên khóa đó thì một phép nối sẽ kết quả nếu bạn thực hiện hành động đó.

Hash join là tốt nhất tiếp theo, vì nó thường được thực hiện khi một bảng có số lượng nhỏ (tương đối) các mục, tạo bảng tạm thời có băm với mỗi hàng, sau đó tìm kiếm liên tục để tạo tham gia.

Trường hợp xấu nhất là vòng lặp lồng nhau là thứ tự (n * m) có nghĩa là không có thứ tự hoặc kích thước để khai thác và tham gia đơn giản, cho mỗi hàng trong bảng x, bảng tìm kiếm y để tham gia.

+8

Nếu một người luôn tốt hơn người kia, thì người kia sẽ không bao giờ được sử dụng, bạn có nghĩ vậy không? Tôi nghĩ sự khác biệt phức tạp hơn thế này. –

+1

Tôi xin lỗi nếu bạn hiểu lầm tôi. Tôi đã cố gắng để mô tả các loại tham gia và tại sao một hợp nhất tham gia là tốt nhất. Vấn đề là việc kết hợp phối hợp chỉ hoạt động nếu bạn có thứ tự sắp xếp để khai thác và tham gia băm chỉ hiệu quả hơn khi bảng đã nối kết có một số lượng hàng tương đối nhỏ trong đó. Xin lỗi nếu điều đó không rõ ràng trong câu trả lời. – Spence

+0

Vòng lặp lồng nhau là điều tồi tệ nhất của khóa học, khi không có gì khác là có thể. – Spence

Các vấn đề liên quan