|
|
|
Сиквенс и многотабличная вставка
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Есть процедура, которая делает парсинг сложного XML-документа и использует многотабличную вставку с помощью INSERT ALL в одну главную и несколько подчиненных таблиц. В этой процедуре несколько подзапросов и условие, от которого зависит, будет запись вставляться в главную таблицу или одну из подчиненных. Есть общий сиквенс, который генерирует ID-шники для записей в этих таблицах. Использовать сиквенс в подзапросах запрещено, но если для него сделать функцию-обёртку, то это ограничение обходится. Но если провести тест производительности по методу Тома Кайта, с использованием пакета runstats, то выявляются не совсем желательные моменты. По сравнению с первым методом разбора, когда для парсинга главного элемента использовалась одна процедура, а для парсинга вложенных элементов из неё вызывались вложенные процедуры, возрастает время работы, количество защелок и другие параметры: file io wait time, cache table scan latch, session pga memory. Я могу предположить, что увеличение накладных расходов связано с тем, что из-за необходимости применять функцию-обертку возросло количество переключений контекста с SQL на PL/SQL и обратно. На одном из блогов я встречал метод, где предполагалось предварительно генерить значения сиквенса в коллекцию. Но метод довольно недоработанный и оставляет множество вопросов, а автор давно уже забил на свой блог. Вопрос в следующем: кто сталкивался с такой проблемой и как её решал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 10:30 |
|
||
|
Сиквенс и многотабличная вставка
|
|||
|---|---|---|---|
|
#18+
ultrasonic7возрастаетС 999 до 1000? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 10:46 |
|
||
|
Сиквенс и многотабличная вставка
|
|||
|---|---|---|---|
|
#18+
ultrasonic7Использовать сиквенс в подзапросах запрещеноиспользуй в надзапросе. ultrasonic7если для него сделать функцию-обёртку, то это ограничение обходится. обошлось или нет, зависит как оракл проложит план запроса по закопанным в функции граблям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 10:48 |
|
||
|
Сиквенс и многотабличная вставка
|
|||
|---|---|---|---|
|
#18+
Elic , время работы возрастает на 6%, количество защёлок на 30%. Мне поэтому и интересно, кто-то использовал сиквенс в обертке, а если использовал, то как-то кэшировал значения сиквенса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 11:53 |
|
||
|
Сиквенс и многотабличная вставка
|
|||
|---|---|---|---|
|
#18+
-2- , в функции граблей никаких не закопано, она просто возвращает значение сиквенса. Предполагаю, что грабли - во множественном переключении контекста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 11:57 |
|
||
|
Сиквенс и многотабличная вставка
|
|||
|---|---|---|---|
|
#18+
ultrasonic7, Как там с переключением контекстов, если использовать подсказку -2- (nextval в values-ах, а не в подзапросах) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 15:16 |
|
||
|
Сиквенс и многотабличная вставка
|
|||
|---|---|---|---|
|
#18+
Я и этот вариант пробовал, напрямую nextval вызывал в секции VALUES. Но он странно себя ведет, для моих целей неприемлемо. Одно и то же значение сиквенса записывается в качестве ID и в главную, и в дочерние таблицы. В дочерних таблицах есть собственно ID документа и PARENT_ID, равный ID родительского документа. Этот способ иерархию документов нарушает. Так что надо какой-то вариант другой. Может, кто-то кэшировал значений сиквенса в коллекции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2017, 14:09 |
|
||
|
Сиквенс и многотабличная вставка
|
|||
|---|---|---|---|
|
#18+
типа такого? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2017, 15:41 |
|
||
|
Сиквенс и многотабличная вставка
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2017, 15:52 |
|
||
|
Сиквенс и многотабличная вставка
|
|||
|---|---|---|---|
|
#18+
ultrasonic7, -Покажите свои правила формирования из одной последовательности, например, ID для 3 таблиц -или используйте для дочерних таблиц свои последовательности -или не указывайте их для дочерних values, пусть из триггеров берутся и на примере можно показать что не устраивает Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2017, 15:59 |
|
||
|
Сиквенс и многотабличная вставка
|
|||
|---|---|---|---|
|
#18+
Хоть и достаточно времени прошло, отпишусь) Все советы принял к сведению. Провел серию экспериментов. В том числе создавал для дочерних таблиц триггеры на вставку, но впоследствии отказался от этой идеи, т.к. логика работы размазывается по нескольким объектам БД. Сейчас пакет работает на продуктиве, есть уже заполненные таблицы, и поэтому переходить на использование для дочерних таблиц своих последовательностей конкретно в данном случае будет сложновато, т.к. дочерних таблиц много. Для каждого сиквенса нужно будет высчитывать стартовое значение, причем своё. Хотя в целом идея довольно неплоха и первоначально я так и хотел сделать - для таблиц первого уровня вложенности одна последовательность, для таблиц второго уровня - другая и т.д. Поэтому было решено обойтись малой кровью и применить тот совет, который предложил MazoHist , только в упрощенном виде. Точнее, воспользоваться свойствами самого сиквенса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 13:02 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39577454&tid=1884592]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 346ms |

| 0 / 0 |
