powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как hash join пропихнуть в merge
3 сообщений из 3, страница 1 из 1
как hash join пропихнуть в merge
    #39321805
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть несложный мёрдж
5 тыщ строк мёрджятся две минуты -- предполагаю, из-за нестед лупс
данные таблицы апдейтятся другими данными той же таблицы, в которой 150 тыщ строк, партиций нет
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
MERGE INTO (SELECT id_zakaz_ss,
                   z.id_part,
                   z.oper,
                   z.id_kp_k,
                   idvers,
                   z.brak_ndok,
                   z.kod_oper,
                   datan,
                   datak,
                   plan_fakt
              FROM ZAKAZ_INS z
             WHERE datan = :p_datan
               AND datak = :p_datak
               AND plan_fakt = :p_plan_fakt
               AND NVL (IS_ERROR, 0) <> 1
               AND priz = 3) z
 USING (SELECT zi.brak_ndok,
               id_zakaz_ss,
               id_part,
               oper,
               id_kp_k,
               kod_oper
          FROM zakaz_ins zi
         WHERE zi.datan = :p_datan
           AND zi.datak = :p_datak
           AND zi.plan_fakt = :p_plan_fakt
           AND NVL (IS_ERROR, 0) <> 1
           AND zi.priz = 9
        HAVING COUNT (*) > 0) zi
    ON (z.id_zakaz_ss = zi.id_zakaz_ss
    AND z.id_part + 0 = zi.id_part + 0
    AND z.oper = zi.oper
    AND z.id_kp_k = zi.id_kp_k)
WHEN MATCHED
THEN
   UPDATE SET z.brak_ndok = ***


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
NAME					OPTIONS		OBJECT_NAME
MERGE STATEMENT		
    MERGE						ZAKAZ_INS_TBL
        VIEW		
            NESTED LOOPS		
                NESTED LOOPS		
                    TABLE ACCESS	BY INDEX ROWID	ZAKAZ_INS_TBL
                        INDEX		RANGE SCAN	ZAKAZ_INS_TBL_INDX
                    INDEX		RANGE SCAN	ZAKAZ_INS_TBL_INDX
                TABLE ACCESS		BY INDEX ROWID	ZAKAZ_INS_TBL

вставляю в первый запрос full, во второй групп бай - мердж идёт за 0.3 сек
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
MERGE INTO (SELECT /*+ full (z) */
                   id_zakaz_ss,
                   z.id_part,
                   z.oper,
                   z.id_kp_k,
                   idvers,
                   z.brak_ndok,
                   z.kod_oper,
                   datan,
                   datak,
                   plan_fakt
              FROM ZAKAZ_INS z
             WHERE datan = :p_datan
               AND datak = :p_datak
               AND plan_fakt = :p_plan_fakt
               AND NVL (IS_ERROR, 0) <> 1
               AND priz = 3) z
 USING (SELECT zi.brak_ndok,
               id_zakaz_ss,
               id_part,
               oper,
               id_kp_k,
               kod_oper
          FROM zakaz_ins zi
         WHERE zi.datan = :p_datan
           AND zi.datak = :p_datak
           AND zi.plan_fakt = :p_plan_fakt
           AND NVL (IS_ERROR, 0) <> 1
           AND zi.priz = 9
        GROUP BY zi.brak_ndok,
                 id_zakaz_ss,
                 id_part,
                 oper,
                 id_kp_k,
                 kod_oper
        HAVING COUNT (*) > 0) zi
    ON (z.id_zakaz_ss = zi.id_zakaz_ss
    AND z.id_part + 0 = zi.id_part + 0
    AND z.oper = zi.oper
    AND z.id_kp_k = zi.id_kp_k)
WHEN MATCHED
THEN
   UPDATE SET z.brak_ndok = ***

вот второй план
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
NAME						OPTIONS		OBJECT_NAME
MERGE STATEMENT		
    MERGE							ZAKAZ_INS_TBL
        VIEW		
            HASH JOIN		
                TABLE ACCESS			FULL		ZAKAZ_INS_TBL
                VIEW		
                    FILTER		
                        SORT			GROUP BY	
                            TABLE ACCESS	BY INDEX ROWID	ZAKAZ_INS_TBL
                                INDEX		RANGE SCAN	ZAKAZ_INS_TBL_INDX

скорость устраивает, но смущает хинт и прочие телодвижения

статистка собирается, последний Last Analyzed за 01/10/2016 23:03:59
...
Рейтинг: 0 / 0
как hash join пропихнуть в merge
    #39321812
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,

посмотрите в мониторе или выполните с + gather_plan_statistics - сходится ли ожидаемое число строк с реальными.
Возможно на каком то столбце фильтрации таблицы "ZAKAZ_INS" нужна гистограмма.
И надеюсь что bind peking не отключено.
...
Рейтинг: 0 / 0
как hash join пропихнуть в merge
    #39321856
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
глянул в таблицу
разрабы не указали нот наллы по ключевым полям
Код: plsql
1.
2.
3.
4.
ALTER TABLE Z MODIFY datan NOT NULL;
ALTER TABLE Z MODIFY datak NOT NULL;
ALTER TABLE Z MODIFY plan_fakt NOT NULL;
ALTER TABLE Z MODIFY idvers NOT NULL;

и собрал статистику
всё залетало
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как hash join пропихнуть в merge
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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