Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
SQL, PL/SQL, T-SQL: запросы, DML DDL операторы, пакеты, процедуры, функции, триггеры и последовательности.
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5

ТЕМА:

Re: joined update в Oracle 12 года 8 мес. назад #2752

  • Rita
  • Rita аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Спасибо получено: 0
А ведь в моем примере вложенный запрос, а не джойнед, а мне бы просто синтаксис со словами 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

  • Rita
  • Rita аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Спасибо получено: 0
Спасиб, признаюсь - поленилась проверить.
А вот и сам план.

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

  • Rita
  • Rita аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Спасибо получено: 0
Через курсор - это вариант.
А для 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
В данном случае единожды выполняется запрос на выборку условий, а потом изменяется требуемая таблица. В Оракле такой синтаксис не предусмотрен, по крайней мере пока, вплоть до 9i, если не ошибаюсь. Хотя м.б. есть что-нибудь другое, позволяющее решить данную задачу только на SQL в понимании Oracle:)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5
Время создания страницы: 0.430 секунд