|
|
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
Nobody1111LOB-ы используются? ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 04:52 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
И какое буквально сообщение об ошибке? Указывает ли оно на undo (rollback) сегмент с конкретным именем? Или там просто: ORA-01555: snapshot too old: rollback segment number with name "" too small Для полноты картины: какая версия Oracle? Поставлены ли патчсеты, патчи, если да, какие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 05:15 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
Елена Н., Код: plsql 1. 2. 3. 4. 5. 6. Я так понимаю что вместо констант стоят переменные которые приходят извне, но это не очень хорошая практика для оптимизации т.к. эти поля ТОЧНО не попадут в индекс (если они участвуют в индексах). Еще не мешало бы проверить типы (поля ec.kod_pred, ec.otd, ec.y4, ec.dog - точно number, если нет то перевести переменные (проставленные константами) в нужный тип). Я бы попробовал как-то так (пока просто попробовать и посмотреть на изменение плана) ну и проставить типы, если надо, правильные: Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 11:09 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 14:39 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
Елена Н.Nobody1111 LOB-ы используются? авторлобы проверю, но по-моему нет в запросе их точно нет, в таблицах из запроса вряд ли вру, LOB есть в таблицах HZ_CUST_ACCT_SITES_ALL и HZ_LOCATIONS, это как-то влияет? я же эти поля в запрос не беру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 14:59 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
Елена Н. Про 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 сек как бы обязывают... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2017, 15:50 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
Vladimir Filin25000 -- хм...почему так мало! Что бы получить 70 сек на count(*) нужно. Вчера на своём сервер 80 млн в табличку загнал, что бы получить 7 сек на count(*) CONNECT BY (ROWNUM <= 1E+6) А сколько данных в тратата? Partitioning имеется? 70 сек как бы обязывают... Потому что "тратата" это по сути древняя запутанная вьюшка, из которой мне надо только маленькую часть данных. select * from тратата второй час идет и бестолку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 08:43 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
Елена Н.select * from тратата второй час идет и бестолку. select count(*) from тратата ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 08:44 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 08:46 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
Елена Н.Елена Н.select * from тратата второй час идет и бестолку. select count(*) from тратата Елена Н.Ранее: До кучи select count(*) from тратата 70 sec Что-то тут не так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 09:46 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
envЕлена Н.пропущено... select count(*) from тратата это по всем данным env Елена Н.Ранее: До кучи select count(*) from тратата 70 sec Что-то тут не так это только только по нужной части ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 12:24 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
Елена Н.Имею запрос, сложный, тяжелый, но в итоге долгих оптимизаций выполнимый за приемлемое время. вот поверх него count(*) сколько идёт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 12:50 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
Елена Н.+ сравнить планы селекта и инсерта в очередной раз сравнила, практически идентичныне те планы сравниваете... надо сравнивать реальные планы. И в конце концов хоть трассировку сделайте. Три страницы гаданий... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 13:06 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
envЕлена Н.Имею запрос, сложный, тяжелый, но в итоге долгих оптимизаций выполнимый за приемлемое время. вот поверх него count(*) сколько идёт? 70 sec ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 13:24 |
|
||
|
Запрос "умирает" при попытке вставить данные таблицу.
|
|||
|---|---|---|---|
|
#18+
Елена Н., Код: plsql 1. 2. 3. 4. 5. 6. В 9.2.0.6 тоже не выполняется за приемлемое время и падает с 01555? Снимите уже трассировку своих select и insert. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2017, 13:57 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39453534&tid=1885928]: |
0ms |
get settings: |
5ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
186ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 486ms |

| 0 / 0 |
