powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сиквенс и многотабличная вставка
11 сообщений из 11, страница 1 из 1
Сиквенс и многотабличная вставка
    #39576593
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Есть процедура, которая делает парсинг сложного XML-документа и использует многотабличную вставку с помощью INSERT ALL в одну главную и несколько подчиненных таблиц. В этой процедуре несколько подзапросов и условие, от которого зависит, будет запись вставляться в главную таблицу или одну из подчиненных. Есть общий сиквенс, который генерирует ID-шники для записей в этих таблицах. Использовать сиквенс в подзапросах запрещено, но если для него сделать функцию-обёртку, то это ограничение обходится. Но если провести тест производительности по методу Тома Кайта, с использованием пакета runstats, то выявляются не совсем желательные моменты. По сравнению с первым методом разбора, когда для парсинга главного элемента использовалась одна процедура, а для парсинга вложенных элементов из неё вызывались вложенные процедуры, возрастает время работы, количество защелок и другие параметры: file io wait time, cache table scan latch, session pga memory. Я могу предположить, что увеличение накладных расходов связано с тем, что из-за необходимости применять функцию-обертку возросло количество переключений контекста с SQL на PL/SQL и обратно.
На одном из блогов я встречал метод, где предполагалось предварительно генерить значения сиквенса в коллекцию. Но метод довольно недоработанный и оставляет множество вопросов, а автор давно уже забил на свой блог.
Вопрос в следующем: кто сталкивался с такой проблемой и как её решал?
...
Рейтинг: 0 / 0
Сиквенс и многотабличная вставка
    #39576612
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7возрастаетС 999 до 1000?
...
Рейтинг: 0 / 0
Сиквенс и многотабличная вставка
    #39576613
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7Использовать сиквенс в подзапросах запрещеноиспользуй в надзапросе.

ultrasonic7если для него сделать функцию-обёртку, то это ограничение обходится. обошлось или нет, зависит как оракл проложит план запроса по закопанным в функции граблям.
...
Рейтинг: 0 / 0
Сиквенс и многотабличная вставка
    #39576689
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic , время работы возрастает на 6%, количество защёлок на 30%. Мне поэтому и интересно, кто-то использовал сиквенс в обертке, а если использовал, то как-то кэшировал значения сиквенса?
...
Рейтинг: 0 / 0
Сиквенс и многотабличная вставка
    #39576696
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2- , в функции граблей никаких не закопано, она просто возвращает значение сиквенса. Предполагаю, что грабли - во множественном переключении контекста.
...
Рейтинг: 0 / 0
Сиквенс и многотабличная вставка
    #39576901
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7,

Как там с переключением контекстов, если использовать подсказку -2- (nextval в values-ах, а не в подзапросах) ?
...
Рейтинг: 0 / 0
Сиквенс и многотабличная вставка
    #39577408
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я и этот вариант пробовал, напрямую nextval вызывал в секции VALUES. Но он странно себя ведет, для моих целей неприемлемо. Одно и то же значение сиквенса записывается в качестве ID и в главную, и в дочерние таблицы. В дочерних таблицах есть собственно ID документа и PARENT_ID, равный ID родительского документа. Этот способ иерархию документов нарушает. Так что надо какой-то вариант другой. Может, кто-то кэшировал значений сиквенса в коллекции?
...
Рейтинг: 0 / 0
Сиквенс и многотабличная вставка
    #39577447
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
типа такого?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare
 sq sys.odcinumberlist;
begin 
select sequence.nextval
 bulk collect into sq
 from dual
 connect by level < =10;
 
 for i in (select * from table(cast(sq as sys.odcinumberlist))) loop
   dbms_output.put_line(i.column_value);
 end loop;  
end; 
...
Рейтинг: 0 / 0
Сиквенс и многотабличная вставка
    #39577454
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7Но он странно себя ведет, для моих целей неприемлемо. Одно и то же значение сиквенса записывается в качестве ID и в главную, и в дочерние таблицы.

Он - INSERT ALL - ведет себя так как документиовано 3.2 Sequence Pseudocolumns :

Oracle DocFor each INSERT ... [ALL | FIRST] statement (multitable insert). A multitable insert is considered a single SQL statement. Therefore, a reference to the NEXTVAL of a sequence will increase the sequence only once for each input record coming from the SELECT portion of the statement. If NEXTVAL is specified more than once in any part of the INSERT ... [ALL | FIRST ] statement, then the value will be the same for all insert branches, regardless of how often a given record might be inserted.

For each input row in a multitable INSERT ALL statement. NEXTVAL is incremented once for each row returned by the subquery, regardless of how many occurrences of the insert_into_clause map to each row.

SY.
...
Рейтинг: 0 / 0
Сиквенс и многотабличная вставка
    #39577456
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7,

-Покажите свои правила формирования из одной последовательности, например, ID для 3 таблиц
-или используйте для дочерних таблиц свои последовательности
-или не указывайте их для дочерних values, пусть из триггеров берутся

и на примере можно показать что не устраивает
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
insert all
 when (gid >= :b1) then into top_10(dt, id, someattr ) values(dt, S01_SEQ.NEXTVAL, someattr) 
 when (gid >  :b2) then into totals(dt, id, parent_id) values(dt, S02_SEQ.NEXTVAL, S01_SEQ.NEXTVAL) 
 when (gid =  :b3) then into totalx(dt, id, parent_id) values(dt, S03_SEQ.NEXTVAL, S01_SEQ.NEXTVAL) 
------------------ тестовые данные --
 WITH t AS (SELECT ...
              FROM dual CONNECT BY LEVEL < 101)
-------------------------------------
 select ...
...
Рейтинг: 0 / 0
Сиквенс и многотабличная вставка
    #39584344
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хоть и достаточно времени прошло, отпишусь) Все советы принял к сведению. Провел серию экспериментов. В том числе создавал для дочерних таблиц триггеры на вставку, но впоследствии отказался от этой идеи, т.к. логика работы размазывается по нескольким объектам БД. Сейчас пакет работает на продуктиве, есть уже заполненные таблицы, и поэтому переходить на использование для дочерних таблиц своих последовательностей конкретно в данном случае будет сложновато, т.к. дочерних таблиц много. Для каждого сиквенса нужно будет высчитывать стартовое значение, причем своё. Хотя в целом идея довольно неплоха и первоначально я так и хотел сделать - для таблиц первого уровня вложенности одна последовательность, для таблиц второго уровня - другая и т.д. Поэтому было решено обойтись малой кровью и применить тот совет, который предложил MazoHist , только в упрощенном виде. Точнее, воспользоваться свойствами самого сиквенса.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сиквенс и многотабличная вставка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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