Lợi ích/tổn thất hiệu suất giữa các phép nối băm và kết hợp kết nối, cụ thể trong Oracle RDBMS là gì?Sự khác nhau giữa việc tham gia băm và kết hợp hợp nhất (Oracle RDBMS) là gì?
Trả lời
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:
- 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.
- Đố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.
- Đố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
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.
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. –
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
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
- 1. sự khác nhau giữa từ khóa tham gia và từ khóa kết hợp bên trong trong sql oracle là gì?
- 2. Sự khác nhau giữa tham gia vòng lặp lồng nhau và tham gia băm trong SQL Server 2008
- 3. Sự khác nhau giữa SVN và Git để hợp nhất là gì?
- 4. Sự khác nhau giữa "bao gồm" và "tham gia" trong truy vấn ActiveRecord là gì?
- 5. LINQ: Sự khác nhau giữa == và bằng tham gia là gì?
- 6. Sự khác nhau giữa osql, isql và sqlcmd là gì?
- 7. Sự khác nhau giữa pls_integer và binary_integer là gì?
- 8. Sự khác biệt giữa việc tham gia trái và tham gia bên ngoài bên trái
- 9. Tham gia nhiều cam kết khác nhau mà không cần hợp nhất
- 10. Sự khác nhau giữa SyncML và CalDAV là gì?
- 11. Sự khác nhau giữa == và = trong Prolog là gì?
- 12. Sự khác nhau giữa LinkedBlockingQueue và ConcurrentLinkedQueue là gì?
- 13. Sự khác nhau giữa MySQL, MySQLi và PDO là gì?
- 14. Sự khác nhau giữa việc sử dụng Tham gia trong LINQ và "Phong cách Olde" trước cú pháp tham gia ANSI là gì?
- 15. Sự khác nhau giữa "bool" và "bool" là gì?
- 16. Sự khác nhau giữa DefaultSelenium và RemoteWebDriver là gì?
- 17. Sự khác nhau giữa cơ sở dữ liệu và kho dữ liệu là gì?
- 18. Sự khác nhau giữa PECL và PEAR là gì?
- 19. Sự khác nhau giữa BaseAdapter và ArrayAdapter là gì?
- 20. Sự khác nhau giữa TFS, SVN và GIT là gì?
- 21. Sự khác nhau giữa tar và zip là gì?
- 22. Sự khác nhau giữa mẫu mặt tiền và bộ điều hợp là gì?
- 23. Sự khác nhau giữa bộ điều hợp kênh và mẫu cổng nhắn tin là gì?
- 24. Sự khác nhau giữa phiên bản phát hành và tích hợp là gì?
- 25. Sự khác nhau hợp lý giữa PostQuitMessage() và DestroyWindow() là gì?
- 26. Sự khác nhau giữa BufRead và BufEnter là gì?
- 27. Sự khác nhau giữa ODBC và OleDB là gì?
- 28. Sự khác nhau giữa metaClass.methods và metaClass.metaMethods là gì?
- 29. Sự khác nhau giữa objc_exception_throw và [NSException raise] là gì?
- 30. Sự khác nhau giữa init() và window.init() là gì?
http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i76073 –
http://www.orafaq.com/node/1446 – cagcowboy
http://use-the-index-luke.com/sql/join –