Theo tài liệu tôi đã đọc, bộ lưu trữ mặc định cho một CLOB hoặc BLOB là nội tuyến, có nghĩa là nếu nó nhỏ hơn kích thước khoảng 4k thì nó sẽ được giữ trong bảng.Oracle 10g nhỏ Blob hoặc Clob không được lưu trữ nội tuyến?
Nhưng khi tôi thử nghiệm điều này trên một bảng giả trong Oracle (10.2.0.1.0) hiệu suất và phản hồi từ Oracle Monitor (bởi Allround Automations) cho thấy rằng nó đang được tổ chức bên ngoài bảng.
Dưới đây là kịch bản thử nghiệm của tôi ...
create table clobtest (x int primary key, y clob, z varchar(100))
;
insert into clobtest
select object_id, object_name, object_name
from all_objects where rownum < 10001
;
select COLUMN_NAME, IN_ROW
from user_lobs
where table_name = 'CLOBTEST'
;
này hiển thị: Y YES (gợi ý rằng Oracle sẽ lưu trữ clob ở hàng)
select x, y from CLOBTEST where ROWNUM < 1001 -- 8.49 seconds
select x, z from CLOBTEST where ROWNUM < 1001 -- 0.298 seconds
Vì vậy, trong trường hợp này, các giá trị CLOB sẽ có độ dài tối đa 30 ký tự, vì vậy phải luôn là nội dòng. Nếu tôi chạy Oracle Monitor, nó cho thấy một LOB.Length theo sau là một LOB.Read() cho mỗi hàng trả về, một lần nữa cho thấy rằng các giá trị clob được tổ chức bên ngoài bảng.
Tôi cũng đã cố gắng tạo bảng như thế này
create table clobtest
(x int primary key, y clob, z varchar(100))
LOB (y) STORE AS (ENABLE STORAGE IN ROW)
nhưng có chính xác kết quả tương tự.
Có ai có bất kỳ đề xuất nào về cách tôi có thể bắt buộc (thuyết phục, khuyến khích) Oracle lưu trữ giá trị trong dòng trong bảng không? (Tôi hy vọng để đạt được thời gian đáp ứng tương tự như đọc z cột varchar2)
UPDATE: Nếu tôi chạy SQL này
select COLUMN_NAME, IN_ROW, l.SEGMENT_NAME, SEGMENT_TYPE, BYTES, BLOCKS, EXTENTS
from user_lobs l
JOIN USER_SEGMENTS s
on (l.Segment_Name = s. segment_name)
where table_name = 'CLOBTEST'
sau đó tôi nhận được kết quả như sau ...
Y YES SYS_LOB0000398621C00002$$ LOBSEGMENT 65536 8 1
Nếu tôi có thể giới thiệu cho bạn nhiều hơn tôi muốn, đây là một phản hồi tuyệt vời –