Согласно документам, которые я прочитал, хранилище по умолчанию для CLOB или BLOB является встроенным, что означает, что, если его размер меньше приблизительно 4 КБ, он будет храниться в таблице.
Но когда я проверяю это на фиктивной таблице в Oracle (10.2.0.1.0), производительность и ответ от Oracle Monitor (от Allround Automations) предполагают, что он удерживается вне таблицы.
Вот мой тестовый сценарий ...
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'
;
Это показывает: ДА ДА (предполагая, что Oracle будет хранить сгусток в строке)
select x, y from CLOBTEST where ROWNUM < 1001 -- 8.49 seconds
select x, z from CLOBTEST where ROWNUM < 1001 -- 0.298 seconds
Так что в этом случае значения CLOB будут иметь максимальную длину 30 символов, поэтому всегда должны быть встроенными. Если я запускаю Oracle Monitor, он показывает LOB.Length, за которым следует LOB.Read () для каждой возвращаемой строки, что снова указывает на то, что значения clob хранятся вне таблицы.
Я также пытался создать такую таблицу
create table clobtest
( x int primary key, y clob, z varchar(100) )
LOB (y) STORE AS (ENABLE STORAGE IN ROW)
но получил точно такие же результаты.
Есть ли у кого-нибудь предложения, как я могу заставить (убедить, поощрить) Oracle хранить значение clob in-line в таблице? (Я надеюсь добиться того же времени отклика, что и при чтении столбца varchar2 z)
ОБНОВЛЕНИЕ: если я запускаю этот SQL
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'
тогда я получаю следующие результаты ...
Y YES SYS_LOB0000398621C00002$$ LOBSEGMENT 65536 8 1