Добро пожаловать, Гость |
SQL, PL/SQL, T-SQL: запросы, DML DDL операторы, пакеты, процедуры, функции, триггеры и последовательности.
ТЕМА:
Re: joined update в Oracle 12 года 8 мес. назад #2752
А ведь в моем примере вложенный запрос, а не джойнед, а мне бы просто синтаксис со словами UPDATE & INNER JOIN | |
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе. |
Re: joined update в Oracle 12 года 8 мес. назад #2753
| Никакой принципиальной разницы в порядке доступа к данным между mssql и oracle нет и быть не может. Если есть предикат в where и селективный индекс, то он будет использоваться. Т.к. у вас не OLAP запрос, обычный для OLTP систем, то создайте необходимые индексы и вставьте для перестраховки в свой подзапрос хинт /*+ rule */ select /*+ rule */ b.analitic_id .. Что касается плана выполнения в PL/SQL Developer 5.0.2.500, то никакой он не графический (как кстате в mssql EE), а обычный текстовый. Все что надо сделать - это вызвать правое контекстное меню находясь мышью на плане - там только одна опция - "COPY" |
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе. |
Re: joined update в Oracle 12 года 8 мес. назад #2754
Спасиб, признаюсь - поленилась проверить. А вот и сам план. UPDATE STATEMENT, GOAL = ALL_ROWS 25 33326 866476
UPDATE FORTMETA INVENT_KARTA
TABLE ACCESS FULL FORTMETA INVENT_KARTA 25 33326 866476
FILTER
SORT AGGREGATE 1 39
TABLE ACCESS FULL FORTMETA OBJECTEVENTS 1 1 39
NESTED LOOPS OUTER 64777 428130450237797 2.17918399171039E17
INDEX UNIQUE SCAN FORTMETA PK_METABC 1226 8582
NESTED LOOPS OUTER 64777 34920917637667 1.75303006541088E16
INDEX UNIQUE SCAN FORTMETA PK_MOL 1226 15938
NESTED LOOPS OUTER 64777 2848361960658 1.39284899876176E15
INDEX UNIQUE SCAN FORTMETA PK_DIVISION 1226 15938
NESTED LOOPS OUTER 64777 232329686840 110588930935840
INDEX UNIQUE SCAN FORTMETA PK_DIVISION 1226 15938
NESTED LOOPS OUTER 64777 18950219155 8773951468765
INDEX UNIQUE SCAN FORTMETA PK_METABC 1226 8582
NESTED LOOPS OUTER 64777 1545694874 704836862544
INDEX UNIQUE SCAN FORTMETA PK_METABC 1226 8582
FILTER
NESTED LOOPS OUTER
TABLE ACCESS BY INDEX ROWID FORTMETA METAANSCH 1 195461 6450213
INDEX UNIQUE SCAN FORTMETA PK_METAANSCH 195461
NESTED LOOPS OUTER 275 64502 26832832
TABLE ACCESS BY INDEX ROWID FORTMETA METAANSCH 1 195461 6450213
INDEX UNIQUE SCAN FORTMETA PK_METAANSCH 195461
NESTED LOOPS OUTER 242 33 12639
INDEX UNIQUE SCAN FORTMETA PK_KOD_TYPE_PROV 82 1066
NESTED LOOPS OUTER 242 33 12210
INDEX UNIQUE SCAN FORTMETA PK_KOD_MONTH 82 1066
NESTED LOOPS OUTER 242 33 11781
TABLE ACCESS BY INDEX ROWID FORTMETA PERIOD 1 82 2132
INDEX UNIQUE SCAN FORTMETA SYS_C003008 82
NESTED LOOPS 209 33 10923
TABLE ACCESS BY INDEX ROWID FORTMETA METAPOS_PROVODKA 6 660 42900
INDEX RANGE SCAN FORTMETA METAPOS_PROVODKA_IDX1 2 660
NESTED LOOPS OUTER 179 5 1330
INDEX UNIQUE SCAN FORTMETA SYS_C003014 246 3198
NESTED LOOPS 179 2 506
NESTED LOOPS OUTER 137 1 240
NESTED LOOPS OUTER 137 1 227
NESTED LOOPS OUTER 137 1 214
NESTED LOOPS 136 1 188
FILTER
NESTED LOOPS OUTER
NESTED LOOPS OUTER 131 5 680
TABLE ACCESS FULL FORTMETA METADOC_SALDO 1 5 550
INDEX FULL SCAN FORTMETA PK_OBJDEPEND 26 1 26
INDEX RANGE SCAN FORTMETA PK_OBJECTEVENTS 2 9 351
INDEX UNIQUE SCAN FORTMETA PK_KOD_STATUS 5 65
TABLE ACCESS BY INDEX ROWID FORTMETA PERIOD 1 82 2132
INDEX UNIQUE SCAN FORTMETA SYS_C003008 82
INDEX UNIQUE SCAN FORTMETA PK_KOD_MONTH 82 1066
INDEX UNIQUE SCAN FORTMETA SYS_C003011 82 1066
VIEW SYS VW_NSO_1 173 2249
SORT UNIQUE 42 173 2249
VIEW FORTMETA V_MOL_DIV_TEK_CUR 41 173 2249
SORT UNIQUE 41 173 23874
UNION-ALL
VIEW FORTMETA PROB_CUR_TEK8 17 13 1794
SORT UNIQUE 17 13 1782
UNION-ALL
NESTED LOOPS 6 1 186
NESTED LOOPS 3 1 173
NESTED LOOPS 1 2 320
TABLE ACCESS FULL FORTMETA MOL 1 4 212
INDEX UNIQUE SCAN FORTMETA PK_DIVISION 62 6634
VIEW FORTMETA 1 13 169
FILTER
CONNECT BY
NESTED LOOPS 2 82 1066
INDEX UNIQUE SCAN FORTMETA PK_DIVISION 1 1 13
TABLE ACCESS FULL SYS DUAL 1 82
TABLE ACCESS BY USER ROWID FORTMETA DIVISION
TABLE ACCESS BY INDEX ROWID FORTMETA DIVISION 1 13 338
INDEX RANGE SCAN FORTMETA INDX_KIND_SUBKIND 2 13
VIEW FORTMETA PROB5 3 13 169
SORT UNIQUE 3 13 1391
FILTER
CONNECT BY
NESTED LOOPS 1 12 792
TABLE ACCESS FULL FORTMETA OBJECTUSERMOL 1 1 53
INDEX UNIQUE SCAN FORTMETA PK_DIVISION 1226 15938
TABLE ACCESS BY USER ROWID FORTMETA DIVISION
TABLE ACCESS BY INDEX ROWID FORTMETA DIVISION 1 13 1391
INDEX RANGE SCAN FORTMETA INDX_KIND_SUBKIND 2 13
NESTED LOOPS OUTER 8 12 1596
VIEW FORTMETA PROB_CUR5 7 1 107
SORT UNIQUE 7 1 133
NESTED LOOPS 6 1 133
HASH JOIN 3 1 120
TABLE ACCESS BY INDEX ROWID FORTMETA DIVISION 1 4 428
INDEX RANGE SCAN FORTMETA PK_DIVISION 2 4
VIEW FORTMETA 1 13 169
FILTER
CONNECT BY
NESTED LOOPS 2 82 1066
INDEX UNIQUE SCAN FORTMETA PK_DIVISION 1 1 13
TABLE ACCESS FULL SYS DUAL 1 82
TABLE ACCESS BY USER ROWID FORTMETA DIVISION
TABLE ACCESS BY INDEX ROWID FORTMETA DIVISION 1 13 338
INDEX RANGE SCAN FORTMETA INDX_KIND_SUBKIND 2 13
VIEW FORTMETA PROB5 13 169
SORT UNIQUE 3 13 1391
FILTER
CONNECT BY
NESTED LOOPS 1 12 792
TABLE ACCESS FULL FORTMETA OBJECTUSERMOL 1 1 53
INDEX UNIQUE SCAN FORTMETA PK_DIVISION 1226 15938
TABLE ACCESS BY USER ROWID FORTMETA DIVISION
TABLE ACCESS BY INDEX ROWID FORTMETA DIVISION 1 13 1391
INDEX RANGE SCAN FORTMETA INDX_KIND_SUBKIND 2 13
TABLE ACCESS FULL FORTMETA MOL 1 1226 31876
VIEW FORTMETA PROB_CUR93 18 160 22080
SORT UNIQUE 18 160 21226
UNION-ALL
HASH JOIN OUTER 6 159 21147
VIEW FORTMETA PROB_CUR9 3 13 1391
SORT UNIQUE 3 13 1391
FILTER
CONNECT BY
NESTED LOOPS 2 12 948
NESTED LOOPS 2 1 66
TABLE ACCESS FULL FORTMETA OBJECTUSERMOL 1 1 53
VIEW FORTMETA 13 169
CONNECT BY
NESTED LOOPS 2 82 1066
INDEX UNIQUE SCAN FORTMETA PK_DIVISION 1 1 13
TABLE ACCESS FULL SYS DUAL 1 82
TABLE ACCESS BY USER ROWID FORTMETA DIVISION
TABLE ACCESS BY INDEX ROWID FORTMETA DIVISION 1 13 338
INDEX RANGE SCAN FORTMETA INDX_KIND_SUBKIND 2 13
INDEX UNIQUE SCAN FORTMETA PK_DIVISION 1226 15938
TABLE ACCESS BY USER ROWID FORTMETA DIVISION
TABLE ACCESS BY INDEX ROWID FORTMETA DIVISION 1 13 1391
INDEX RANGE SCAN FORTMETA PK_DIVISION 1 13
TABLE ACCESS FULL FORTMETA MOL 1 1226 31876
NESTED LOOPS 6 1 79
VIEW FORTMETA PROB_CUR9 13 169
SORT UNIQUE 3 13 1391
FILTER
CONNECT BY
NESTED LOOPS 2 12 948
NESTED LOOPS 2 1 66
TABLE ACCESS FULL FORTMETA OBJECTUSERMOL 1 1 53
VIEW FORTMETA 13 169
CONNECT BY
NESTED LOOPS 2 82 1066
INDEX UNIQUE SCAN FORTMETA PK_DIVISION 1 1 13
TABLE ACCESS FULL SYS DUAL 1 82
TABLE ACCESS BY USER ROWID FORTMETA DIVISION
TABLE ACCESS BY INDEX ROWID FORTMETA DIVISION 1 13 338
INDEX RANGE SCAN FORTMETA INDX_KIND_SUBKIND 2 13
INDEX UNIQUE SCAN FORTMETA PK_DIVISION 1226 15938
TABLE ACCESS BY USER ROWID FORTMETA DIVISION
TABLE ACCESS BY INDEX ROWID FORTMETA DIVISION 1 13 1391
INDEX RANGE SCAN FORTMETA PK_DIVISION 1 13
HASH JOIN 3 1 66
TABLE ACCESS FULL FORTMETA MOL 1 4 212
TABLE ACCESS FULL FORTMETA OBJECTUSERMOL 1 5 65 Понимаю, что без индексов не обойтись, но БД не моя | |
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе. Последнее редактирование: от Rita. |
Re: joined update в Oracle 12 года 8 мес. назад #2755
Попробуй избавится от соотнесенного запроса, переписав все на pl/sql, к примеру: begin
for i in (
select b.object_code_4
, b.analitic_id
from v_metapos_saldo b
, v_metadoc_saldo c
where b.doc_id = c.id
and a.obj_id = b.object_code_4
and c.Number like 'X0-%'
) loop
update invent_karta a set
a.stoim_bux_id = i.nalitic_id
where a.obj_id = i.object_code_4
end loop;
end;
/ Что следует учесть: в данном случае значения invent_karta, для которых не нашлось записей invent_karta.stoim_bux_id = v_metapos_saldo.analitic_id не изменятся, когда как в твоем первоначальном запросе они станут null. | |
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе. |
Re: joined update в Oracle 12 года 8 мес. назад #2756
Через курсор - это вариант. А для invent_karta гарантированно есть запись в v_metapos_saldo удовлетворяющая указанному предикату, и даже, предположим не одна, а вот как это оракл разруливает - непонятно. Но начать запрос запрос с "другой стороны" действительно выгоднее, т.к. выборка из invent_karta легче, чем из v_metapos_saldo в которой записей на порядок больше и еще джойнится с другой таблицей. Одним словом - спасибо. | |
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе. |
Re: joined update в Oracle 12 года 8 мес. назад #2757
Кстати, может в этом и корень твоей проблемы. Насколько помню, в MSSQL и Sybase подобный запрос не требовал бы никакого соотнесения, а выглядел бы примерно так: update invent_karta a set
a.stoim_bux_id = b.nalitic_id
from v_metapos_saldo b
, v_metadoc_saldo c
where b.doc_id = c.id
and a.obj_id = b.object_code_4
and c.Number like 'X0-%'
and a.obj_id = b.object_code_4 | |
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе. |
Время создания страницы: 0.430 секунд