Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / сегмент LOB растет, хотя объем данных без изменений / 15 сообщений из 15, страница 1 из 1
07.04.2021, 11:57
    #40060309
receiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сегмент LOB растет, хотя объем данных без изменений
смотрю чужое приложение, где выполняется 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
07.04.2021, 13:55
    #40060357
PuM256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сегмент LOB растет, хотя объем данных без изменений
receiver,

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

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

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

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

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

Расшифровываю - в отличие от обычных колонок, при изменении лоба, для того чтобы обеспечить согласованное чтение, Оракл сохраняет предыдущие значения в том же самом сегменте. Параметр RETENTION (в отличие от PCTVERSION) означает, что сохранять он будет количество версий, нужное для согласованного чтения данных за время, установленное параметром undo_retention. Соответственно, меньше undo_retention - меньше расход пространства (и выше риск отхватить ora-01555).
...
Рейтинг: 0 / 0
09.04.2021, 16:42
    #40061094
SeaGate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сегмент LOB растет, хотя объем данных без изменений
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
10.04.2021, 16:28
    #40061354
receiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сегмент LOB растет, хотя объем данных без изменений
выполнил совсем простые шаги

Код: 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
10.04.2021, 20:41
    #40061382
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сегмент LOB растет, хотя объем данных без изменений
receiver
Я правильно считаю, что в любом случае сам Oracle не будет заниматься
уменшением объема, занимаемого сегментом
Сегмент сам по себе никогда не уменьшается.
...
Рейтинг: 0 / 0
10.04.2021, 21:48
    #40061387
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сегмент LOB растет, хотя объем данных без изменений
receiver
выполнил совсем простые шаги

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

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

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

update lobs_tab set clob_col = clob_col ;

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

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

update lobs_tab set clob_col = clob_col ;

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


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

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

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

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

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


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