Oracle 10g: могут ли длины данных CLOB быть меньше 4000? - PullRequest
3 голосов
/ 16 апреля 2011

У нас есть три базы данных: dev, staging и production. Мы делаем все наше кодирование в среде разработчиков. Затем мы помещаем весь наш код и изменения базы данных в стадию, чтобы клиент мог видеть, как это работает в реальной среде. После их завершения мы выполняем окончательное развертывание в производственной среде.

Теперь об этих столбцах CLOB: при использовании desc и / или запросе представления all_tab_columns для базы данных dev, CLOB показывают длину данных 4000. Однако в промежуточных и производственных базах данных длины для столбцов CLOB, эквивалентных dev, равны нечетным числам, например 86. Я искал каждое возможное решение о том, как это могло произойти. Я даже пытался добавить новый столбец CLOB (86), думая, что он будет работать так же, как и для VARCHAR2, но Oracle просто выдает ошибку.

Могли ли администраторы базы данных что-то испортить? Это даже что-то беспокоиться? Казалось, что в результате этого ничего не сломалось, но мне просто нравится, что метаданные одинаковы во всех средах.

Ответы [ 4 ]

4 голосов
/ 27 августа 2011

DATA_LENGTH хранит максимальное количество байтов, которое будет занято в строке для столбца.Если CLOB может храниться в строке, то максимальное значение равно 4000. LOBS никогда не будет занимать более 4000 байтов.Если в хранилище строк отключено, то LOB будет хранить только ту информацию указателя, которая ему необходима для поиска данных LOB, что намного меньше 4000 байтов.

SQL> create table t (clob_in_table clob
  2     , clob_out_of_table clob
  3  ) lob (clob_out_of_table) store as (disable storage in row)
  4     , lob (clob_in_table) store as (enable storage in row)
  5  /

Table created.

SQL> select table_name, column_name, data_length
  2  from user_tab_columns
  3  where table_name = 'T'
  4  /

TABLE_NAME                     COLUMN_NAME                    DATA_LENGTH
------------------------------ ------------------------------ -----------
T                              CLOB_IN_TABLE                         4000
T                              CLOB_OUT_OF_TABLE                       86

РЕДАКТИРОВАТЬ, добавляя информацию в *_LOBS view

Используйте представление [DBA | ALL | USER] _LOBS для просмотра определенных в строке параметров хранения строк вне строки:

SQL> select table_name
  2     , cast(substr(column_name, 1, 30) as varchar2(30))
  3     , in_row
  4  from user_lobs
  5  where table_name = 'T'
  6  /

TABLE_NAME                     CAST(SUBSTR(COLUMN_NAME,1,30)A IN_
------------------------------ ------------------------------ ---
T                              CLOB_IN_TABLE                  YES
T                              CLOB_OUT_OF_TABLE              NO

EDIT 2,некоторые ссылки

См. Хранилище больших объектов в Руководство разработчика приложений базы данных Oracle - Большие объекты для получения дополнительной информации об определении хранилища больших объектов, особенно в третьей заметке, в которой говорится очто можно изменить:

Примечание:

Только некоторые параметры хранения могут быть изменены.Например, вы можете использовать оператор ALTER TABLE ... MODIFY LOB, чтобы изменить RETENTION, PCTVERSION, CACHE или NO CACHE LOGGING или NO LOGGING, а также предложение STORAGE.

Вы также можете изменить TABLESPACE с помощью инструкции ALTER TABLE ... MOVE.

Однако после создания таблицы вы не можете изменить размер CHUNK, либо ENABLE, либо DISABLE STORAGE.Настройки IN ROW.

Кроме того, больших объектов в индексированных организованных таблицах говорит:

По умолчанию все большие объекты в организованной индексной таблице создаются безсегмент переполнения будет сохранен вне линии.Другими словами, если организованная по индексу таблица создается без сегмента переполнения, тогда у больших объектов в этой таблице свои атрибуты хранения по умолчанию как DISABLE STORAGE IN ROW.Если вы принудительно попытаетесь указать условие ENABLE STORAGE IN ROW для таких больших объектов, то SQL выдаст ошибку.

Это объясняет, почему jonearles не видел 4000 в столбце data_length, когда он создавал большой объект виндексная организованная таблица.

4 голосов
/ 17 апреля 2011

Прежде всего, мне - как dba - жаль видеть отсутствие сотрудничества между вами и dbas. Мы все должны сотрудничать, чтобы быть успешными. Длина данных Clob может быть менее 4000 байтов.

create table z ( a number, b clob);
Table created.
insert into z values (1, 'boe');

1 row created.
exec dbms_stats.gather_table_stats (ownname => 'ronr', tabname => 'z');

PL/SQL procedure successfully completed.
select owner, avg_row_len from dba_tables where table_name = 'Z'
SQL> /

OWNER                  AVG_ROW_LEN
------------------------------ -----------
RONR                       109

select length(b) from z;

 LENGTH(B)
----------
     3

Где вы находите, что длина сгустка не может быть меньше 4000?

3 голосов
/ 18 апреля 2011

CLOB не имеют указанной длины. Когда вы запрашиваете ALL_TAB_COLUMNS, например ::

select table_name, column_name, data_length
from all_tab_columns
where data_type = 'CLOB';

Вы заметите, что data_length всегда 4000, но это следует игнорировать.

Минимальный размер CLOB равен нулю (0), а максимальный - от 8 ТБ до 128 ТБ в зависимости от размера блока базы данных.

1 голос
/ 18 апреля 2011

Как отметили ik_zelf и Джеффри Кемп, CLOB могут хранить менее 4000 байтов.

Но почему длины данных CLOB не всегда 4000?Число на самом деле не ограничивает CLOB, но вы, вероятно, правы, опасаясь, что метаданные на ваших серверах будут другими.Возможно, вы захотите запустить DBMS_METADATA.GET_DDL на объектах на всех серверах и сравнить результаты.

Мне удалось создать низкую длину data_length путем добавления CLOB к организованной по индексу таблице.

create table test
(
    column1 number,
    column2 clob,
    constraint test_pk primary key (column1)
)
organization index;

select data_length from user_tab_cols
where table_name = 'TEST' and column_name = 'COLUMN2';

10.2.0.1.0 - 116.
11.2.0.1.0 - 476.

Эти цифры не имеют никакого смысла для меня, и я думаю,это ошибкаНо я не очень хорошо понимаю различные варианты хранения, может быть, я просто что-то упускаю.

Кто-нибудь знает, что на самом деле здесь происходит?

...