powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос "умирает" при попытке вставить данные таблицу.
15 сообщений из 65, страница 3 из 3
Запрос "умирает" при попытке вставить данные таблицу.
    #39453530
Nobody1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nobody1111LOB-ы используются?
?
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39453534
Nobody1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И какое буквально сообщение об ошибке? Указывает ли оно на undo (rollback) сегмент с конкретным именем? Или там просто:

ORA-01555: snapshot too old: rollback segment number with name "" too small

Для полноты картины: какая версия Oracle? Поставлены ли патчсеты, патчи, если да, какие?
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39453647
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елена Н.,

Код: plsql
1.
2.
3.
4.
5.
6.
............................
 31             AND ec.kod_pred = DECODE(5, -1, ec.kod_pred, 5)
 32             AND ec.otd = NVL(7, ec.otd)
 33             AND ec.y4 = NVL(75, ec.y4)
 34             AND ec.dog = NVL(null, ec.dog)
............................



Я так понимаю что вместо констант стоят переменные которые приходят извне, но это не очень хорошая практика для оптимизации т.к. эти поля ТОЧНО не попадут в индекс (если они участвуют в индексах). Еще не мешало бы проверить типы (поля ec.kod_pred, ec.otd, ec.y4, ec.dog - точно number, если нет то перевести переменные (проставленные константами) в нужный тип). Я бы попробовал как-то так (пока просто попробовать и посмотреть на изменение плана) ну и проставить типы, если надо, правильные:
Код: plsql
1.
2.
3.
4.
5.
6.
........................
31 and (5 = -1 or ec.kod_pred = 5)
32 and (7 is null or ec.otd = 7)
33 and (75 is null or ec.y4 = 75)
34 and (null is null or ec.dog = null)
.......................
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39453848
Елена Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir FilinЕсли insert from select не прокачается, можно, как вариант PL/SQL Bulk SQL and Bulk Binding
Limiting Bulk FETCH with LIMIT

FORALL Statement
Всё ж лучше построчной вставки...

Я тоже думала, но эти инструменты вроде как массовую обработку обеспечивают, а мне бы еще строки на условия проверять, какие-то добавлять, какие-то нет (то, что в запросе закомментировано, если их обеспечивать в самом запросе, то индексы отваливаются)

Vladimir Filin1. Тест на зависимость проблемы от конкретного запроса. Пусть будет другой запрос, проверим IO
CREATE TABLE ttt AS
SELECT ROWNUM num_test1, ROWNUM num_test2, 'a' var_test1, 'a' var_test2 --и так далее для всех колонок блаблабла
FROM DUAL
CONNECT BY (ROWNUM <= [кол-во строк из моего запроса] );


create table e_lenka_temp2 as
SELECT ROWNUM DOC_ID,
'a' DOC_NUMBER,
SYSDATE DOC_DATE,
'a' CLASS,
ROWNUM CUSTOMER_ID,
ROWNUM CUSTOMER_SITE_USE_ID,
'a' CUSTOMER_NUMBER,
'a' CUSTOMER_ALT_NAME,
'a' GROUP1,
'a' GROUP2,
'a' GROUP3,
SYSDATE PERIOD_BEG,
SYSDATE PERIOD_END,
ROWNUM DUE_DOC,
ROWNUM IN_DOLG,
ROWNUM AMOUNT_DUE,
ROWNUM AMOUNT_OPL,
ROWNUM OUT_DOLG
FROM DUAL
CONNECT BY (ROWNUM <= 25000 );
отрабатывает за 2 с.

stax..заполнить "временную" табличку построчно (курсором)
потом
insert into xxx select * from "временная"
если тормозит, то проблема не в селекте
не томозит, проблема в селекте

envКстати, база-то в archivelog?
нет, сервера тестовые, там без надобности

ora6011 Rows на выходе в плане .. передайте админам привет и заодно напомните чтобы собрали статистику )
говорит, что статистика каждый месяц собирается, но привет передала :)

Nobody1111 LOB-ы используются?
авторлобы проверю, но по-моему нет
в запросе их точно нет, в таблицах из запроса вряд ли

MaximaXXL Я так понимаю что вместо констант стоят переменные которые приходят извне, но это не очень хорошая практика
типы данных и там, и там текстовые, number только здесь, ибо пофиг
а индексы не отваливаются, видно по плану выполнения, у одной таблицы только нет индекса в плане, она малюсенькая, ей не нужно
автор
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
|  97 |          TABLE ACCESS BY INDEX ROWID         | HZ_CUST_ACCT_SITES_ALL          |     2 |    38 |     2 |
|* 98 |           INDEX RANGE SCAN                   | HZ_CUST_ACCT_SITES_N3           |     2 |       |     1 |
|* 99 |         TABLE ACCESS BY INDEX ROWID          | HZ_PARTY_SITES                  |     1 |    20 |     1 |
|*100 |          INDEX UNIQUE SCAN                   | HZ_PARTY_SITES_U1               |     1 |       |       |
|*101 |        INDEX UNIQUE SCAN                     | HZ_LOCATIONS_U1                 |     1 |    12 |       |
| 102 |       TABLE ACCESS BY INDEX ROWID            | HZ_PARTIES                      |     1 |    29 |     1 |
|*103 |        INDEX UNIQUE SCAN                     | HZ_PARTIES_U1                   |     1 |       |       |
| 104 |      TABLE ACCESS BY INDEX ROWID             | YY_TS_OTDCONS                   |   107 | 10379 |     1 |
|*105 |       INDEX UNIQUE SCAN                      | YY_IU_OTDCONS                   |     1 |       |       |
| 106 |     TABLE ACCESS FULL                        | YY_TS_BUDGETS                   |  1062 |  9558 |     4 |
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39453873
Елена Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Елена Н.Nobody1111 LOB-ы используются?
авторлобы проверю, но по-моему нет
в запросе их точно нет, в таблицах из запроса вряд ли
вру, LOB есть в таблицах HZ_CUST_ACCT_SITES_ALL и HZ_LOCATIONS, это как-то влияет? я же эти поля в запрос не беру.
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39453921
Фотография Vladimir Filin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елена Н. Про PL/SQL Bulk SQL and Bulk Binding: ... а мне бы еще строки на условия проверять, какие-то добавлять, какие-то нет

Тогда PL/SQL Bulk SQL должен хорошо подойти для Вашей задачи. Как вариант, решение в общем виде:
- определить курсор c1 для селекта со всеми необходимыми данными для дальнейших проверок (и возможно, "заглушками" для новых производных данных)
- определить коллекцию t1_t (type) по курсору
- определить одну или несколько ссылочных коллекций ins1_t, ins2_t,...upd1_t, upd2_t...,del1_t, del2_t для реализации "какие-то добавлять, какие-то нет"
- определить переменную limit_ для LIMITа строк, так что бы много, но ниже границы тормозов
- OPEN c1;
- LOOP в цикле пока не кончится курсор:
- - FETCH c1 BULK COLLECT INTO t1_t LIMIT limit_;
- - Бегаете по данным в t1_t: FOR i IN t1_t.FIRST .. t1_t.LAST LOOP, проверяете/изменяете/дополняете, пишете (ins1_t.EXTEND,...) ссылки на элементы t1_t в ins1_t,....
- - " FORALL Statements for Sparse Collections ": FORALL i IN VALUES OF ins1_t INSERT INTO тратата (бла1, бла2, бла3) VALUES (t1_t.бла1(i), t1_t.бла2(i), t1_t.бла3(i));
- - Если нужно, insert/update/delete FORALL-ами в другие таблицы
- - Если нужно, контроль " Getting Number of Rows Affected by FORALL Statement "
- - Если допустимо: COMMIT;
- - t1_t.delete;
- - ins1_t.delete, ... upd1_t.delete, ... del1_t.delete
- EXIT WHEN c1%NOTFOUND;
- END LOOP;
- CLOSE c1;

Дополненный список линков для PL/SQL Bulk SQL and Bulk Binding
Limiting Bulk FETCH with LIMIT

FORALL Statement

FORALL FORALL Statements for Sparse Collections

Getting Number of Rows Affected by FORALL Statement

Примеры, если нужно 20402712

Елена Н.Ранее: До кучи
select count(*) from тратата
70 sec

create table e_lenka_temp2 as
SELECT ...
CONNECT BY (ROWNUM <= 25000 );
отрабатывает за 2 с.

25000 -- хм...почему так мало! Что бы получить 70 сек на count(*) нужно. Вчера на своём сервер 80 млн в табличку загнал, что бы получить 7 сек на count(*)
CONNECT BY (ROWNUM <= 1E+6)

А сколько данных в тратата? Partitioning имеется? 70 сек как бы обязывают...
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39454315
Елена Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir Filin25000 -- хм...почему так мало! Что бы получить 70 сек на count(*) нужно. Вчера на своём сервер 80 млн в табличку загнал, что бы получить 7 сек на count(*)
CONNECT BY (ROWNUM <= 1E+6)

А сколько данных в тратата? Partitioning имеется? 70 сек как бы обязывают...

Потому что "тратата" это по сути древняя запутанная вьюшка, из которой мне надо только маленькую часть данных.
select * from тратата второй час идет и бестолку.
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39454317
Елена Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Елена Н.select * from тратата второй час идет и бестолку.
select count(*) from тратата
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39454319
Елена Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nobody1111И какое буквально сообщение об ошибке? Указывает ли оно на undo (rollback) сегмент с конкретным именем? Или там просто:

ORA-01555: snapshot too old: rollback segment number with name "" too small

Для полноты картины: какая версия Oracle? Поставлены ли патчсеты, патчи, если да, какие?

ORA-01555: snapshot too old: rollback segment number 1 with name "_SYSSMU1$" too small

Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39454360
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елена Н.Елена Н.select * from тратата второй час идет и бестолку.
select count(*) from тратата

Елена Н.Ранее: До кучи
select count(*) from тратата
70 sec

Что-то тут не так
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39454535
Елена Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envЕлена Н.пропущено...

select count(*) from тратата
это по всем данным
env
Елена Н.Ранее: До кучи
select count(*) from тратата
70 sec

Что-то тут не так
это только только по нужной части
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39454557
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елена Н.Имею запрос, сложный, тяжелый, но в итоге долгих оптимизаций выполнимый за приемлемое время.

вот поверх него count(*) сколько идёт?
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39454577
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Елена Н.+ сравнить планы селекта и инсерта
в очередной раз сравнила, практически идентичныне те планы сравниваете... надо сравнивать реальные планы. И в конце концов хоть трассировку сделайте. Три страницы гаданий...
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39454599
Елена Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envЕлена Н.Имею запрос, сложный, тяжелый, но в итоге долгих оптимизаций выполнимый за приемлемое время.

вот поверх него count(*) сколько идёт?

70 sec
...
Рейтинг: 0 / 0
Запрос "умирает" при попытке вставить данные таблицу.
    #39454637
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елена Н.,

Код: plsql
1.
2.
3.
4.
5.
6.
insert /*+ append */ into ...  
with t as
       (select /*+ materialize */
        from "Имею запрос, сложный, тяжелый, но в итоге долгих оптимизаций выполнимый за приемлемое время"
       )
select * from t



В 9.2.0.6 тоже не выполняется за приемлемое время и падает с 01555?

Снимите уже трассировку своих select и insert.
...
Рейтинг: 0 / 0
15 сообщений из 65, страница 3 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос "умирает" при попытке вставить данные таблицу.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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