powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / сегмент LOB растет, хотя объем данных без изменений
15 сообщений из 15, страница 1 из 1
сегмент LOB растет, хотя объем данных без изменений
    #40060309
receiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смотрю чужое приложение, где выполняется UPDATE таблицы с полем LOB.
update TABLE set ID = new_ID, lob_col = old_LOB.
т.е. разработчики пытаются выполнить изменение LOB'a тем же значением.
на вопрос ЗАЧЕМ?! искренне отвечают, что да, это гавнокод получился, но менять не хотят - мол, долго.
Объем LOB'a > 1Mb, т.е. хранится в сегменте, не в строке таблицы.
эти UPDATE они выполняют постоянно. в результате размер данных не меняется, а размер сегмента растет, как на дрожжах.

я правильно понимаю, что Oracle просто добавляет, повторяет данные этого LOB'a в сегменте, не заботясь
как-то выкинуть то, что было и как-то уменьшить размер сегмента?

Можно ли что-то сделать для автоматического уменьшения размера сегмента, чтобы не заставлять разработчиков менять код?

LOG сегмент - SECUREFILE.
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40060357
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
receiver,

Почитайте про PCTVERSION/RETENTION.
https://docs.oracle.com/cd/B28359_01/appdev.111/b28393/adlob_tables.htm#CIHEBABG
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40060756
receiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PuM256, спасибо, но

К сожалению, PCTVERSION не имеет значения при SecureFile, а в той таблице LOB именно такой.
RETENTION определяет связь с UNDO_RETENTION при определении консистентности запросов,
но вряд ли приводит к действиям Oracle по удалению данных и физическому уменьшению сегменат LOB
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40060775
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
receiver
PuM256, спасибо, но

К сожалению, PCTVERSION не имеет значения при SecureFile, а в той таблице LOB именно такой.
RETENTION определяет связь с UNDO_RETENTION при определении консистентности запросов,
но вряд ли приводит к действиям Oracle по удалению данных и физическому уменьшению сегменат LOB

Да уж, тебе перед RETENTION нужно было почитать про LOB, как он хранится и как реализовано UNDO для него.
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40060966
receiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|, сенкс!

Но простое совет как остановить рост сегмента,
с учетом того, что данные не меняются, было бы более полезным,
чем совет "читать документацию"
)
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40061000
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
receiver
Но простое совет как остановить рост сегмента,
с учетом того, что данные не меняются, было бы более полезным,
чем совет "читать документацию"
Это просто означает "что не в коня корм".
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40061049
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
receiver,

Расшифровываю - в отличие от обычных колонок, при изменении лоба, для того чтобы обеспечить согласованное чтение, Оракл сохраняет предыдущие значения в том же самом сегменте. Параметр RETENTION (в отличие от PCTVERSION) означает, что сохранять он будет количество версий, нужное для согласованного чтения данных за время, установленное параметром undo_retention. Соответственно, меньше undo_retention - меньше расход пространства (и выше риск отхватить ora-01555).
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40061094
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
receiverт.е. разработчики пытаются выполнить изменение LOB'a тем же значением.
..
эти UPDATE они выполняют постоянно. в результате размер данных не меняется, а размер сегмента растет, как на дрожжах.
..
я правильно понимаю, что Oracle просто добавляет, повторяет данные этого LOB'a в сегменте, не заботясь
как-то выкинуть то, что было и как-то уменьшить размер сегмента?

update lob на себя в этом случае это обновление локатора на то же значение. Одно это не будет приводить к росту lob segment в свежих версиях. Какая используется версия в проблемном случае - не указано. DDL - отсутствует.
Изучите Recommended Securefile LOB fixes in 11.2.0.4, 12c, 18c and Later (Doc ID 2605308.1) .
Если ничего подходящего по симптомам нет, то соберите тест-кейс, на котором продемонстрируете рост lob segment при обновлении его на себя же.

receiverМожно ли что-то сделать для автоматического уменьшения размера сегмента, чтобы не заставлять разработчиков менять код?

Будет тест-кейс, где будет рост lob при обновлении локатора на себя, то можно с этим работать.
Альтернативно выполнить дефрагментацию, в 21c это автоматом: SecureFiles Defragmentation
В догонку, приведите вывод dbms_space.space_usage для проблемного lob segment и реальный размер данных через dbms_lob.getlength
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40061354
receiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выполнил совсем простые шаги

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
create table lobs_tab (
    id number,
    clob_col clob
);

insert into lobs_tab (id, clob_col) values (1, empty_clob());

select bytes from user_segments where segment_name = 'SYS_LOB0000033146C00002$$';

 
BYTES
--------
131072
 
update lobs_tab set clob_col = rpad(clob_col, 1000000, '!');
select bytes from user_segments where segment_name = 'SYS_LOB0000033146C00002$$';

 
BYTES
----------
3342336
 
select dbms_lob.getlength(clob_col) len from lobs_tab;

 
LEN
----------
1000000
 

update lobs_tab set clob_col = 'test of update' || clob_col where id = 1;
select bytes from user_segments where segment_name = 'SYS_LOB0000033146C00002$$';

 
BYTES
----------
5439488
 
select dbms_lob.getlength(clob_col) len from lobs_tab;

 LEN
----------
1000014
 

UNDO_RETENTION 900 - по умолчанию

скрипт таблицы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  CREATE TABLE "TEST_SCHEMA"."LOBS_TAB" 
   (	"ID" NUMBER(5,0), 
	"CLOB_COL" CLOB
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TEST_SCHEMA" 
 LOB ("CLOB_COL") STORE AS SECUREFILE (
  TABLESPACE "TEST_SCHEMA" ENABLE STORAGE IN ROW CHUNK 8192
  NOCACHE LOGGING  NOCOMPRESS  KEEP_DUPLICATES 
  STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)) ;

Я правильно считаю, что в любом случае сам Oracle не будет заниматься
уменшением объема, занимаемого сегментом, не зависимо от UNDO_RETENTION?
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40061382
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
receiver
Я правильно считаю, что в любом случае сам Oracle не будет заниматься
уменшением объема, занимаемого сегментом
Сегмент сам по себе никогда не уменьшается.
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40061387
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
receiver
выполнил совсем простые шаги

update lobs_tab set clob_col = rpad(clob_col, 1000000, '!');

И где тут "обновление на самоё себя"?
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40061392
receiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильный Вася,

если мы имеем ввиду вот такой оператор

update lobs_tab set clob_col = clob_col ;

то ничего не меняется, и длина строки getlentgh остается 1000000,
а размер сегмента остается 3342336 байт, сколько бы раз update не был выполнен.
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40061402
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
receiver

если мы имеем ввиду вот такой оператор

update lobs_tab set clob_col = clob_col ;

то ничего не меняется, и длина строки getlentgh остается 1000000,
а размер сегмента остается 3342336 байт, сколько бы раз update не был выполнен.


Естественно Oracle не будет обновлять CLOB и посему писать в CLOB UNDO если понимает что в CLOB ничего не изменилось.

SY.
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40061443
receiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

конечно, но это я ответил на вопрос Правильного Васи
)
...
Рейтинг: 0 / 0
сегмент LOB растет, хотя объем данных без изменений
    #40061604
receiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
задавал и менят параметр RETENTION до одной секунды.

alter table lobs_tab modify lob (clob_col) (retention min 1);

предполагал, что после этого Oracle будет использовать место,
занятое UNDO-данными Большого объекта.
но ничего не изменилось.
при UPDATE lobs_tab set clob_col = <DATA> ...
размер сегмента растет, растет и растет...
(
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / сегмент LOB растет, хотя объем данных без изменений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]