Oracle LOB не сохраняется встроенным

Настройка

У меня есть таблица оракула с парой атрибутов и типом данных CLOB. Приведенную ниже таблицу я создал двумя способами, каждый из которых должен вести себя одинаково.

CREATE TABLE DEMO(
a number (10, 2),
data CLOB
)

CREATE TABLE DEMO(
a number (10, 2),
data CLOB
) LOB (data) Stored AS (STORAGE IN ROW ENABLED)

Сценарий

  1. Согласно документации оракула, когда CLOB больше 4000 байтов, он будет сохранен в виде встроенного контура.

  2. Когда я сохраняю данные в этой таблице для значения clob, скажите «Hello», а затем я вижу информацию о сегменте для «Demo table» и «Demo table LOB segment», это показывает, что все данные собираются в таблицу и нет новых блоки потребляются в сегменте Lob.

  3. Когда я храню большие данные с общим символом менее 1500, я также получаю то же поведение, что и выше.

  4. Но когда я сохраняю данные с общим символом> 2000 и ‹3000, тогда данные большого объекта направляются в сегмент большого объекта, даже если общее количество символов меньше 3000.

Вопрос

  1. Почему в LOB-сегмент поступают данные размером менее 3000 символов? . Это то, что каждый символ занимает 2 байта, что оправдывает, что данные до 1500 идут в данные, а не в сегмент журнала.

Проблема

Много места на диске тратится впустую из-за таблицы LOB, поскольку размер CHUNK составляет 8 КБ, а данные в блоке всегда будут иметь размер от 3 до 4 КБ, а в некоторых случаях и больше. Столь существенное для каждой строки пространство 4 КБ тратится впустую, а в случае 20 млн строк он работает в 50 ГБ


person Pratik Garg    schedule 15.04.2014    source источник
comment
Вы используете UTF8? Какие символы вы храните? Если они в основном не являются символами ASCII, 2000 символов могут быть преобразованы в более чем 4000 байтов.   -  person Drunix    schedule 15.04.2014
comment
Я использую только символы UTF-8. Также я создал таблицу с помощью varchar2 (4000) и попытался вставить те же данные, которые были сохранены в схеме. и хранилище было успешно, что в основном означает, что общее количество байт составляет ‹4000   -  person Pratik Garg    schedule 15.04.2014


Ответы (1)


Это может объяснить описанное выше поведение.

Типы данных CLOB и NCLOB хранят до 4 гигабайт символьных данных в базе данных. CLOB хранят данные набора символов базы данных, а NCLOB хранят данные национального набора символов Unicode. Для наборов символов базы данных переменной ширины значение CLOB хранится в база данных использует двухбайтовый набор символов Unicode, имеющий фиксированную ширину. Oracle преобразует сохраненное значение Unicode в набор символов, запрошенный на клиенте или на сервере, который может иметь фиксированную или изменяющуюся ширину. Когда вы вставляете данные в столбец CLOB с использованием набора символов различной ширины, Oracle преобразует данные в Unicode перед сохранением в базе данных ».

http://docs.oracle.com/cd/B10500_01/server.920/a96524/c13datyp.htm#3234

person Pratik Garg    schedule 16.04.2014