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

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

Как там с переключением контекстов, если использовать подсказку -2- (nextval в values-ах, а не в подзапросах) ?
...
Рейтинг: 0 / 0
28.12.2017, 14:09
    #39577408
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сиквенс и многотабличная вставка
Я и этот вариант пробовал, напрямую nextval вызывал в секции VALUES. Но он странно себя ведет, для моих целей неприемлемо. Одно и то же значение сиквенса записывается в качестве ID и в главную, и в дочерние таблицы. В дочерних таблицах есть собственно ID документа и PARENT_ID, равный ID родительского документа. Этот способ иерархию документов нарушает. Так что надо какой-то вариант другой. Может, кто-то кэшировал значений сиквенса в коллекции?
...
Рейтинг: 0 / 0
28.12.2017, 15:41
    #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
28.12.2017, 15:52
    #39577454
SY
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
28.12.2017, 15:59
    #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
15.01.2018, 13:02
    #39584344
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сиквенс и многотабличная вставка
Хоть и достаточно времени прошло, отпишусь) Все советы принял к сведению. Провел серию экспериментов. В том числе создавал для дочерних таблиц триггеры на вставку, но впоследствии отказался от этой идеи, т.к. логика работы размазывается по нескольким объектам БД. Сейчас пакет работает на продуктиве, есть уже заполненные таблицы, и поэтому переходить на использование для дочерних таблиц своих последовательностей конкретно в данном случае будет сложновато, т.к. дочерних таблиц много. Для каждого сиквенса нужно будет высчитывать стартовое значение, причем своё. Хотя в целом идея довольно неплоха и первоначально я так и хотел сделать - для таблиц первого уровня вложенности одна последовательность, для таблиц второго уровня - другая и т.д. Поэтому было решено обойтись малой кровью и применить тот совет, который предложил MazoHist , только в упрощенном виде. Точнее, воспользоваться свойствами самого сиквенса.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сиквенс и многотабличная вставка / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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