Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Копирование коллекций  [new]
IMNO
Member

Откуда:
Сообщений: 65
Здравствуйте.

Возник вопрос по поводу копирования коллекций.
Для примера, есть коллекция вида:
TYPE tab_collect IS RECORD(a NUMBER(10), b VARCHAR2(100));
TYPE t_collect IS TABLE OF tab_collect;
r_collect t_collect := t_collect();


Пусть в коллекции r_collect 100000 элементов.
Делаю вторую точно такую же коллекцию r_collect2, и пишу следующее:
r_collect2 := r_collect;


Так во вопрос. Первая коллекция копируется во вторую полностью? Все 100000 элементов?
Или копируется только ссылка на область памяти? То есть фактически это будут не две разные области памяти, а одна область памяти с двумя ссылками на неё?
5 окт 18, 09:00    [21695978]     Ответить | Цитировать Сообщить модератору
 Re: Копирование коллекций  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28274
IMNO
Так во вопрос.
Ты не умеешь поставить эксперимент?
5 окт 18, 09:41    [21696015]     Ответить | Цитировать Сообщить модератору
 Re: Копирование коллекций  [new]
IMNO
Member

Откуда:
Сообщений: 65
Я уже.

DECLARE 
  TYPE t_test IS RECORD(a NUMBER(10), b VARCHAR2(250));
  TYPE tab_test IS TABLE OF t_test;
  r_test1 tab_test := tab_test();
  r_test2 tab_test := tab_test();
BEGIN  
  r_test1.EXTEND(1);
  r_test1(1).a := 1;
  r_test1(1).b := '1';
  
  r_test2 := r_test1;
  
  dbms_output.put_line('r_test2 = ' || r_test2(1).a);
  dbms_output.put_line('r_test2 = ' || r_test2(1).b);
  
  r_test2(1).a := 2;
  r_test2(1).b := '2';
  
  dbms_output.put_line('r_test1 = ' || r_test1(1).a);
  dbms_output.put_line('r_test1 = ' || r_test1(1).b);
  dbms_output.put_line('r_test2 = ' || r_test2(1).a);
  dbms_output.put_line('r_test2 = ' || r_test2(1).b);
END;

Ну то есть коллекция полностью копируется.
Хотел получить подтверждение от более опытных людей.

Это же получается, что на очень больших коллекциях, пока оракл будет копировать коллекцию, система и подвиснуть может. Опасно.
5 окт 18, 09:47    [21696023]     Ответить | Цитировать Сообщить модератору
 Re: Копирование коллекций  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28274
IMNO
Я уже.
И что ж ты узнал из своего нетленного теста?
IMNO
на очень больших коллекциях, пока оракл будет копировать коллекцию, система и подвиснуть может.
А ты зря не копируй. Или работай пачками.
5 окт 18, 10:03    [21696042]     Ответить | Цитировать Сообщить модератору
 Re: Копирование коллекций  [new]
-2-
Member

Откуда:
Сообщений: 13824
IMNO
подвиснуть
Копирование гигабайта память-память занимает доли секунды. Читать гигабайт данных с диска несколько дольше, но это же не тебя не беспокоит.
5 окт 18, 10:11    [21696049]     Ответить | Цитировать Сообщить модератору
 Re: Копирование коллекций  [new]
IMNO
Member

Откуда:
Сообщений: 65
Elic
И что ж ты узнал из своего нетленного теста?.


Если бы вторая коллекция указывал на ту же область памти, что и первая, то запись:
r_test2(1).a := 2;
r_test2(1).b := '2';


перезаписала бы значения и из первой коллекции.
Во втором выводе тогда не выводились бы "1", только "2".

-2-
Копирование гигабайта память-память занимает доли секунды.


Ну честно говоря, я даже не представляю сколько по времени будет копироваться 1 гигабайт. Сам факт обработки гигабайтов информации в памяти не кажется мне хорошей идеей.
5 окт 18, 10:16    [21696053]     Ответить | Цитировать Сообщить модератору
 Re: Копирование коллекций  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28274
IMNO
Если бы вторая коллекция указывал на ту же область памти, что и первая
У тебе серьёзные проблемы в основах, раз даже такую очевидность тебе приходится проверять.
Про технологии "копирование при изменении" вообще бессмысленно говорить.
5 окт 18, 10:26    [21696063]     Ответить | Цитировать Сообщить модератору
 Re: Копирование коллекций  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
IMNO
Elic
И что ж ты узнал из своего нетленного теста?.


Если бы вторая коллекция указывал на ту же область памти, что и первая, то запись:


проверте в етот момент
сразу после r_test2 := r_test1; и до r_test2(1).a := 2;

.....
stax
5 окт 18, 10:31    [21696066]     Ответить | Цитировать Сообщить модератору
 Re: Копирование коллекций  [new]
IMNO
Member

Откуда:
Сообщений: 65
Stax
IMNO
пропущено...


Если бы вторая коллекция указывал на ту же область памти, что и первая, то запись:


проверте в етот момент
сразу после r_test2 := r_test1; и до r_test2(1).a := 2;

.....
stax


Ничего не понял. Что проверить?
5 окт 18, 10:37    [21696075]     Ответить | Цитировать Сообщить модератору
 Re: Копирование коллекций  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17843
Достаточно проверить занимаемую память
5 окт 18, 10:38    [21696076]     Ответить | Цитировать Сообщить модератору
 Re: Копирование коллекций  [new]
-2-
Member

Откуда:
Сообщений: 13824
IMNO
Сам факт обработки гигабайтов информации в памяти не кажется мне хорошей идеей.
Это не к форуму, а тому, кто тебя заставляет помещать в коллекцию миллионы элементов.
5 окт 18, 11:02    [21696099]     Ответить | Цитировать Сообщить модератору
 Re: Копирование коллекций  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
IMNO
Stax
пропущено...


проверте в етот момент
сразу после r_test2 := r_test1; и до r_test2(1).a := 2;

.....
stax


Ничего не понял. Что проверить?


будут ли две разные области памяти, или одна область памяти с двумя ссылками на неё
5 окт 18, 11:11    [21696111]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить