Hành vi của Oracle LOB là như sau.
LOB được lưu trữ nội tuyến khi:
(
The size is lower or equal than 3964
AND
ENABLE STORAGE IN ROW has been defined in the LOB storage clause
) OR (
The value is NULL
)
LOB được lưu trữ ngoài hàng khi:
(
The value is not NULL
) AND (
Its size is higher than 3964
OR
DISABLE STORAGE IN ROW has been defined in the LOB storage clause
)
Giờ đây, đây không phải là vấn đề duy nhất có thể ảnh hưởng đến hiệu suất.
Nếu các LOB cuối cùng không được lưu trữ nội tuyến, hành vi mặc định của Oracle là tránh lưu chúng vào bộ nhớ đệm (chỉ các LOB nội tuyến mới được lưu trong bộ đệm đệm với các trường khác của hàng). Để yêu cầu Oracle lưu trữ các LOB không nội tuyến, tùy chọn CACHE nên được sử dụng khi LOB được xác định.
Hành vi mặc định là BẬT LƯU TRỮ TRONG ROW và NOCACHE, có nghĩa là các LOB nhỏ sẽ được nội dòng, các LOB lớn sẽ không (và sẽ không được lưu vào bộ nhớ đệm).
Cuối cùng, cũng có một vấn đề về hiệu suất ở cấp độ giao thức truyền thông. Các ứng dụng khách Oracle điển hình sẽ thực hiện thêm 2 bước đi vòng bổ sung cho mỗi LOB để tìm nạp chúng:- một để lấy kích thước của LOB và cấp phát bộ nhớ cho phù hợp - một để tìm nạp chính dữ liệu (miễn là LOB nhỏ)
Những bước vòng bổ sung này được thực hiện ngay cả khi một giao diện mảng được sử dụng để truy xuất kết quả. Nếu bạn truy xuất 1000 hàng và kích thước mảng của bạn đủ lớn, bạn sẽ phải trả cho 1 vòng quay để truy xuất các hàng và 2000 vòng tròn để truy xuất nội dung của LOB.
Xin lưu ý rằng nó không phụ thuộc vào thực tế, LOB có được lưu trữ nội tuyến hay không. Chúng hoàn thành các vấn đề khác nhau.
Để tối ưu hóa ở cấp độ giao thức, Oracle đã cung cấp một động từ OCI mới để tìm nạp một số LOB trong một vòng quay (OCILobArrayRead). Tôi không biết liệu điều gì đó tương tự có tồn tại với JDBC hay không.
Một tùy chọn khác là liên kết LOB ở phía máy khách như thể nó là một RAW / VARCHAR2 lớn. Điều này chỉ hoạt động nếu kích thước tối đa của LOB có thể được xác định (vì kích thước tối đa phải được cung cấp tại thời điểm ràng buộc). Thủ thuật này tránh những rắc rối phụ:LOB chỉ được xử lý như RAW hoặc VARCHAR2. Chúng tôi sử dụng nó rất nhiều trong các ứng dụng chuyên sâu về LOB của mình.
Khi số lượng đường vòng đã được tối ưu hóa, kích thước gói (SDU) có thể được thay đổi kích thước trong cấu hình mạng để phù hợp hơn với tình hình (tức là một số lượng hạn chế các đường vòng lớn). Nó có xu hướng giảm bớt sự kiện chờ "SQL * Net more data to client" và "SQL * Net more data from client".