Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Vòng lặp lồng nhau Tham gia vào Oracle 11g

Mục lục

Tham gia vòng lặp lồng nhau trong Oracle là gì

-Đối với mỗi hàng trong nguồn hàng đầu tiên, truy cập tất cả các hàng từ nguồn hàng thứ hai.
-Các NESTED LOOPS Tham gia là thao tác nối chọn một hàng từ nguồn hàng đầu tiên đã chọn và sử dụng các giá trị của nguồn hàng này để truy cập hoặc chọn từ nguồn hàng đã kết hợp để tìm kiếm hàng phù hợp.
-Tốt nhất cho các giao dịch loại OLTP
-nó sẽ là Nhanh nhất nếu các hàng được trả về từ bảng đầu tiên nhỏ

- Vòng lặp được yêu cầu Tham gia trong Oracle 11g hoạt động khác nhau. Chi tiết về nó được cung cấp trong bài viết này

cách hoạt động của phép nối vòng lặp lồng nhau trong oracle

-Trước tiên, trình tối ưu hóa oracle xác định bảng lái xe và chỉ định nó là vòng lặp bên ngoài. Đây là nguồn của hàng lái xe. Nó tạo ra một tập hợp các hàng để điều khiển điều kiện tham gia. Nguồn hàng có thể là một bảng được truy cập bằng cách sử dụng quét chỉ mục hoặc quét toàn bộ bảng. Các hàng cũng có thể được tạo ra từ bất kỳ hoạt động nào khác. Ví dụ:đầu ra từ Nối vòng lặp lồng nhau có thể được sử dụng làm nguồn hàng.
-Trình tối ưu hóa chỉ định bảng khác làm Vòng lặp bên trong. Điều này được lặp lại cho mọi hàng được trả về từ vòng lặp bên ngoài. Đây là thao tác truy cập trên bảng và lý tưởng là thao tác quét chỉ mục.
-Hoạt động do bảng INNER thực hiện được lặp lại cho mọi hàng được trả về trong bảng OUTER

for x in (select from outer table)
loop
for row in (select from inner table )
loop
joined output rows is returned where condition is matched
end loop
end loop

Ví dụ về tham gia vòng lặp lồng nhau

select /* +use_nl( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no;
SELECT STATEMENT
NESTED LOOP
TABLE ACCESS FULL DEPT
TABLE ACCESS BY INDEX ROWID EMP
INDEX RANGE SCAN EMP_N1

Cách nó được xử lý

(1) Đọc hàng đầu tiên trong DEPT
(2) Thực hiện quét chỉ mục trên EMP_N1 để khớp với dept_no và lấy hàng đầu tiên
(3) Tìm hàng được tham chiếu trong EMP và kết hợp thông tin và cung cấp đầu ra
(4) Lặp lại thao tác 2,3 cho mỗi rowid được trả về
(5) Lặp lại thao tác 1,2,3,4 cho tất cả các hàng trong DEPT

cho x in (chọn từ bảng ghi)
vòng lặp
cho hàng trong (chọn từ bảng trống)
vòng lặp
các hàng đầu ra đã kết hợp được trả về khi điều kiện được khớp
kết thúc vòng lặp
kết thúc vòng lặp

Ở đây, phương pháp truy cập để chọn từ bảng emp sẽ thông qua quét chỉ mục
Nếu trình tối ưu hóa đang chọn sử dụng một số phương pháp kết hợp khác, bạn có thể sử dụng gợi ý USE_NL (A B), trong đó A và B là bí danh của bảng được tham gia.

Tính toán chi phí
Trong phép nối NESTED LOOPS, đối với mỗi hàng trong tập hợp hàng bên ngoài, tập hợp hàng bên trong được truy cập để tìm tất cả các hàng phù hợp để tham gia. Do đó, trong loại kết hợp này, tập hợp hàng bên trong được truy cập nhiều lần bằng số lượng hàng trong tập hợp hàng bên ngoài.
Chi phí :chi phí để truy cập bảng A + không có hàng nào được trả lại từ bảng A X chi phí để truy cập bảng B

Vì vậy, điều này sẽ hiệu quả về chi phí nếu các hàng nhỏ được trả về từ bảng bên ngoài và hoạt động truy cập cho bảng bên trong thông qua quét duy nhất hoặc quét phạm vi chỉ mục nhỏ

Phương pháp mới để tham gia vòng lặp lồng nhau trong Oracle 11g

SELECT STATEMENT
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS FULL DEPT
INDEX UNIQUE SCAN EMP_IDX
TABLE ACCESS BY INDEX ROWID EMP

Tài liệu Oracle cho biết điều này về
Khi một chỉ mục hoặc một khối bảng không có trong bộ đệm đệm và cần thiết để xử lý kết nối, thì cần phải có I / O vật lý. Trong Cơ sở dữ liệu Oracle 11g Release 1 (11.1), Cơ sở dữ liệu Oracle có thể xử lý hàng loạt các yêu cầu I / O vật lý và xử lý chúng bằng cách sử dụng I / O vector thay vì xử lý từng yêu cầu một. Là một phần của triển khai mới cho các phép nối vòng lặp lồng nhau, hai nguồn hàng tham gia NESTED LOOPS có thể xuất hiện trong kế hoạch thực thi mà chỉ một nguồn xuất hiện trong các bản phát hành trước. Trong những trường hợp như vậy, Cơ sở dữ liệu Oracle phân bổ một nguồn hàng tham gia NESTED LOOPS để kết hợp các giá trị từ bảng ở phía bên ngoài của phép nối với chỉ mục ở phía bên trong. Nguồn hàng thứ hai được cấp phát để nối kết quả của phép nối đầu tiên, bao gồm các rowid được lưu trữ trong chỉ mục oracle, với bảng ở phía bên trong của phép nối ”

Tham gia bên ngoài các vòng lặp lồng nhau trong Oracle

-Tương tự với vòng lặp lồng nhau
-Các hàng được trả về ngay cả khi vòng lặp bên trong không có bất kỳ hàng nào đáp ứng tiêu chí
-Không giống như vòng lặp lồng nhau có thể được điều khiển từ một trong hai bảng, đây là một cách tham gia
a =b (+) sẽ luôn chuyển sang a trước b, điều này có thể dẫn đến kế hoạch đắt hơn (có thể không phải NL)
(+) luôn ở bên thiếu

Cũng đã đọc
Hash Join
Phương thức tham gia trong Oracle
https://en.wikipedia.org/wiki/Nested_loop_join


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách xây dựng lại hàng đợi wf_java_deferred

  2. Cách lấy đối tượng Connection hiện tại trong Spring JDBC

  3. Cách so sánh hai bảng theo từng cột trong oracle

  4. Thay thế nhanh hơn trong Oracle để CHỌN COUNT (*) TỪ bàn nào đó

  5. Liệt kê tất cả các trình kích hoạt trong Cơ sở dữ liệu Oracle