Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Зависает merge после добавления столбца в таблицу / 10 сообщений из 10, страница 1 из 1
27.04.2020, 10:06
    #39951848
slawentiy777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает merge после добавления столбца в таблицу
Здравствуйте!
Столкнулся со следующей проблемой: если добавить новый столбец в таблицу, то при выполнении команды merge - запрос зависает. Я уже неоднократно сталкивался с этой проблемой. Помогает только ребилд таблицы, которая подвергается обновлению!
Версия Oracle:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

Вот запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
merge
        into goods t
        using gift.goods@office_vpn s
        on (t.id=s.id)
        when matched then update set 
            t.name=s.name, t.name_uc=s.name_uc, t.producerid=s.producerid, t.taxid=s.taxid, t.goodstypeid=s.goodstypeid, t.goodsgroupid=s.goodsgroupid, t.dimensionid=s.dimensionid, t.price_regulation=s.price_regulation, 
            t.pricegroupid=s.pricegroupid, t.regno=s.regno, t.regdate=s.regdate, t.regexpired=s.regexpired, t.barcode=s.barcode, t.storagecondid=s.storagecondid, t.kratn=s.kratn, t.disable=s.disable, t.isrecept=s.isrecept, 
            t.national_list=s.national_list, t.min_assort=s.min_assort, t.isjob=s.isjob, t.uktz=s.uktz, t.isaplan=s.isaplan, t.bonus_id=s.bonus_id, t.bonus_fixed=s.bonus_fixed, t.bonus_percent=s.bonus_percent, 
            t.release_form_id=s.release_form_id, t.comments=s.comments, t.age=s.age, t.contraindication=s.contraindication, t.tabletki_href=s.tabletki_href, t.compendium_href=s.compendium_href, t.other_href=s.other_href, 
            t.method_of_application=s.method_of_application, t.benefits=s.benefits, t.dose=s.dose, t.capacity_num=s.capacity_num, t.analog_goodsid_by_nds=s.analog_goodsid_by_nds, t.goodsimagesid=s.goodsimagesid, 
            t.elementsinoneitem=s.elementsinoneitem, t.isgetndsfromgoods=s.isgetndsfromgoods, t.maxcountfromonesale=s.maxcountfromonesale 
            where id<>-1
        when not matched then insert 
            (t.id, t.name, t.name_uc, t.producerid, t.taxid, t.goodstypeid, t.goodsgroupid, t.dimensionid, t.price_regulation, t.pricegroupid, t.regno, t.regdate, t.regexpired, t.barcode, t.storagecondid, 
            t.kratn, t.disable, t.isrecept, t.national_list, t.min_assort, t.isjob, t.uktz, t.isaplan, t.bonus_id, t.bonus_fixed, t.bonus_percent, t.release_form_id, t.comments, t.age, t.contraindication, 
            t.tabletki_href, t.compendium_href, t.other_href, t.method_of_application, t.benefits, t.dose, t.capacity_num, t.analog_goodsid_by_nds, t.goodsimagesid, t.elementsinoneitem, t.isgetndsfromgoods, t.maxcountfromonesale
            ) values (
            s.id, s.name, s.name_uc, s.producerid, s.taxid, s.goodstypeid, s.goodsgroupid, s.dimensionid, s.price_regulation, s.pricegroupid, s.regno, s.regdate, s.regexpired, s.barcode, s.storagecondid, 
            s.kratn, s.disable, s.isrecept, s.national_list, s.min_assort, s.isjob, s.uktz, s.isaplan, s.bonus_id, s.bonus_fixed, s.bonus_percent, s.release_form_id, s.comments, s.age, s.contraindication, 
            s.tabletki_href, s.compendium_href, s.other_href, s.method_of_application, s.benefits, s.dose, s.capacity_num, s.analog_goodsid_by_nds, s.goodsimagesid, s.elementsinoneitem, s.isgetndsfromgoods, s.maxcountfromonesale
            )



Из особенностей запроса скажу следующее:
1) в merge используется DBlink;
2) в запросе задействуется довольно много столбцов;

Благодарю за помощь в решении данной проблемы!
...
Рейтинг: 0 / 0
27.04.2020, 11:27
    #39951871
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает merge после добавления столбца в таблицу
slawentiy777,

Покажите планы выполнения команды MERGE
1) До ребилда таблицы (всё плохо)
2) После ребилда таблицы (всё хорошо)
...
Рейтинг: 0 / 0
27.04.2020, 16:35
    #39952019
slawentiy777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает merge после добавления столбца в таблицу
Благодарю, что отозвались!
Высылаю скрин плана ДО и ПОСЛЕ ребилда таблицы.
...
Рейтинг: 0 / 0
28.04.2020, 12:38
    #39952314
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает merge после добавления столбца в таблицу
Попробуйте вернуть на родину посредством хинта DRIVING_SITE
...
Рейтинг: 0 / 0
28.04.2020, 13:21
    #39952332
slawentiy777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает merge после добавления столбца в таблицу
Я вставил DRIVING_SITE в подзапрос, который извлекает данные с удалённого сервера, но ничего не изменилось.
А вообще разве можно использовать этот хинт в merge?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
merge 
    into goods t
    using (select /*+ DRIVING_SITE(o) */ * from gift.goods@office_vpn o) s
    on (t.id=s.id)
    when matched then update set 
        t.name=s.name, t.name_uc=s.name_uc, t.producerid=s.producerid, t.taxid=s.taxid, t.goodstypeid=s.goodstypeid, t.goodsgroupid=s.goodsgroupid, t.dimensionid=s.dimensionid, t.price_regulation=s.price_regulation, 
        t.pricegroupid=s.pricegroupid, t.regno=s.regno, t.regdate=s.regdate, t.regexpired=s.regexpired, t.barcode=s.barcode, t.storagecondid=s.storagecondid, t.kratn=s.kratn, t.disable=s.disable, t.isrecept=s.isrecept, 
        t.national_list=s.national_list, t.min_assort=s.min_assort, t.isjob=s.isjob, t.uktz=s.uktz, t.isaplan=s.isaplan, t.bonus_id=s.bonus_id, t.bonus_fixed=s.bonus_fixed, t.bonus_percent=s.bonus_percent, 
        t.release_form_id=s.release_form_id, t.comments=s.comments, t.age=s.age, t.contraindication=s.contraindication, t.tabletki_href=s.tabletki_href, t.compendium_href=s.compendium_href, t.other_href=s.other_href, 
        t.method_of_application=s.method_of_application, t.benefits=s.benefits, t.dose=s.dose, t.capacity_num=s.capacity_num, t.analog_goodsid_by_nds=s.analog_goodsid_by_nds, t.goodsimagesid=s.goodsimagesid, 
        t.elementsinoneitem=s.elementsinoneitem, t.isgetndsfromgoods=s.isgetndsfromgoods, t.maxcountfromonesale=s.maxcountfromonesale 
        where id<>-1
    when not matched then insert 
        (t.id, t.name, t.name_uc, t.producerid, t.taxid, t.goodstypeid, t.goodsgroupid, t.dimensionid, t.price_regulation, t.pricegroupid, t.regno, t.regdate, t.regexpired, t.barcode, t.storagecondid, 
        t.kratn, t.disable, t.isrecept, t.national_list, t.min_assort, t.isjob, t.uktz, t.isaplan, t.bonus_id, t.bonus_fixed, t.bonus_percent, t.release_form_id, t.comments, t.age, t.contraindication, 
        t.tabletki_href, t.compendium_href, t.other_href, t.method_of_application, t.benefits, t.dose, t.capacity_num, t.analog_goodsid_by_nds, t.goodsimagesid, t.elementsinoneitem, t.isgetndsfromgoods, t.maxcountfromonesale
        ) values (
        s.id, s.name, s.name_uc, s.producerid, s.taxid, s.goodstypeid, s.goodsgroupid, s.dimensionid, s.price_regulation, s.pricegroupid, s.regno, s.regdate, s.regexpired, s.barcode, s.storagecondid, 
        s.kratn, s.disable, s.isrecept, s.national_list, s.min_assort, s.isjob, s.uktz, s.isaplan, s.bonus_id, s.bonus_fixed, s.bonus_percent, s.release_form_id, s.comments, s.age, s.contraindication, 
        s.tabletki_href, s.compendium_href, s.other_href, s.method_of_application, s.benefits, s.dose, s.capacity_num, s.analog_goodsid_by_nds, s.goodsimagesid, s.elementsinoneitem, s.isgetndsfromgoods, s.maxcountfromonesale
        );
...
Рейтинг: 0 / 0
28.04.2020, 13:53
    #39952353
Alexander Anokhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает merge после добавления столбца в таблицу
Хинт driving_site не поможет, поскольку driving site локальный в обоих случаях.

Если хочешь разобраться, то надо посмотреть SQL monitor отчёты обоих случаев, ну или как минимум медленного, оба плана выполнения в читаемом виде, чтобы было видно что посылается в remote, проверить план выполнения на удалённой стороне. Если надо чтобы заработало и забыть, то можешь попробовать запустить merge с outline из хорошего плана, и если надо, то закрепить его профайлом как описано в Doc ID 1400903.1
...
Рейтинг: 0 / 0
28.04.2020, 13:59
    #39952354
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает merge после добавления столбца в таблицу
slawentiy777,

вам надо хинт leading. А вообще показывайте планы лучше через dbms_xplan с advanced
...
Рейтинг: 0 / 0
04.05.2020, 22:30
    #39954193
slawentiy777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает merge после добавления столбца в таблицу
Благодарю за ответы, но ничего не помогает.

Вот план запроса, который ЗАВИСАЕТ (я получил через DBMS_XPLAN.DISPLAY):
Код: 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.
Plan hash value: 1483448804
 
---------------------------------------------------------------------------------------------------------
| Id  | Operation               | Name  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Inst   |IN-OUT|
---------------------------------------------------------------------------------------------------------
|   0 | MERGE STATEMENT         |       | 51798 |   395M|       |  3972   (1)| 00:00:48 |        |      |
|   1 |  MERGE                  | GOODS |       |       |       |            |          |        |      |
|   2 |   VIEW                  |       |       |       |       |            |          |        |      |
|*  3 |    HASH JOIN RIGHT OUTER|       | 51798 |    48M|    18M|  3972   (1)| 00:00:48 |        |      |
|   4 |     TABLE ACCESS FULL   | GOODS | 51840 |    17M|       |   827   (1)| 00:00:10 |        |      |
|   5 |     REMOTE              | GOODS | 51798 |    30M|       |   689   (2)| 00:00:09 | OFFIC~ | R->S |
---------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - access("T"."ID"(+)="S"."ID")
 
Remote SQL Information (identified by operation id):
----------------------------------------------------
 
   5 - SELECT "ID","NAME","BARCODE","BARCODEEXT","REGNO","REGDATE","REGEXPIRED","ISJOB","DISABLE"
       ,"PRICEGROUPID","PRODUCERID","TAXID","GOODSTYPEID","DIMENSIONID","STORAGECONDID","GOODSGROUPID","
       ARTICLE","ISAPLAN","ISGROUP","GROUPID","ORDERBOX","DAYPRESENT","DAYABSENT","QTYCURS","QTYSALES","
       QTYSALES30","QTYSALES14","QTYIN","QTYREST","QTYLEFT","QTYINWAY","QTYPASS","QTYNEEDS","QTYORDER","
       SUMSALES","SUMWEEK","PRICE","SALESGROUP","MORIONID","MORIONNAME","CREATORID","CREATEDATE","COMMEN
       TS","UPDATEDDATE","PRICE0","PRICE1","PRICE2","PRICE3","PRICE4","PRICE5","PRICE6","LASTPRICE0","LA
       STPRICE1","LASTPRICE6","GOODSIMAGESID","PRICE_REGULATION","KRATN","RATING","MAINVENDORID","NOTUSE
       INTBARCODE","NOTUSEFACTBARCODE","SALESGROUPA","SALESGROUPB","ZAKLTXT","ZAKLDATE","ZAKLEXPIRED","C
       OLORID","SIZEID","STRUCTUREID","CAPACITY","ARTNAME","ISRECEPT","MAXPRICE","MARGINE","ISWEIGTH","P
       LUCODE","NO_PRINT_STICKER_BARCODE","UKTZ","ISBUDGET","ISTRANSIT","DEFSTICKERSCNT","TMAX","TMIN","
       SVET","DOSE","RELEASE_FORM_ID","CAPACITY_NUM","PRICEREF","NATIONAL_LIST","MIN_ASSORT","LAST_VENDO
       R_ID","SIGNEDBY","METHOD_OF_APPLICATION","BENEFITS","BONUS_ID","BONUS_FIXED","BONUS_PERCENT","WHO
       LESALEPRICE","ISNOSHARE","GOODSNAME_ID","RELEASEFORM","LIMITSALE","TURNOVER","KRATN_ORDER","OWNER
       ID","NAME_BK","PRODUCER_BK","ID_BK","LASTPRICE1_MAINVENDOR","PRICE_SEGMENTS_ID","LAST_CONTRACT_ID
       ","XYZ_TOTAL","XYZ","XYZ_QTYRATIO","XYZ_SUM2RATIO","XYZ_MARGINRATIO","XYZ_MARGIN","PROMOUTERID","
       MARKET_PRIORITY","MARKET_SIPPRICE","MARKET_BONUS_PERCENT","MARKET_BONUS_SUMMA","ANALOG_GOODSID_BY
       _NDS","NOTZAKAZFROMSUPPLIERS","ISNOTINTERNET","ISPRICE6INTERNET","CONTRAINDICATION","AGE","MARGIN
       FORINTERNET","ELEMENTSINONEITEM","MARKET_PACKET","TABLETKI_HREF","COMPENDIUM_HREF","OTHER_HREF","
       SUMREST","MINPRICE6","NAME_UC","ISGETNDSFROMGOODS","MAXCOUNTFROMONESALE" FROM "GIFT"."GOODS" "S" 
       (accessing 'OFFICE_VPN' )
 



Вот план запроса, который работает ОТЛИЧНО (я получил через DBMS_XPLAN.DISPLAY):
Код: 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.
Plan hash value: 1483448804
 
---------------------------------------------------------------------------------------------------------
| Id  | Operation               | Name  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Inst   |IN-OUT|
---------------------------------------------------------------------------------------------------------
|   0 | MERGE STATEMENT         |       | 51798 |   395M|       |  4275   (1)| 00:00:52 |        |      |
|   1 |  MERGE                  | GOODS |       |       |       |            |          |        |      |
|   2 |   VIEW                  |       |       |       |       |            |          |        |      |
|*  3 |    HASH JOIN RIGHT OUTER|       | 51798 |    48M|    19M|  4275   (1)| 00:00:52 |        |      |
|   4 |     TABLE ACCESS FULL   | GOODS | 51808 |    18M|       |  1100   (1)| 00:00:14 |        |      |
|   5 |     REMOTE              | GOODS | 51798 |    30M|       |   689   (2)| 00:00:09 | OFFIC~ | R->S |
---------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - access("T"."ID"(+)="S"."ID")
 
Remote SQL Information (identified by operation id):
----------------------------------------------------
 
   5 - SELECT "ID","NAME","BARCODE","BARCODEEXT","REGNO","REGDATE","REGEXPIRED","ISJOB","DISABLE"
       ,"PRICEGROUPID","PRODUCERID","TAXID","GOODSTYPEID","DIMENSIONID","STORAGECONDID","GOODSGROUPID","
       ARTICLE","ISAPLAN","ISGROUP","GROUPID","ORDERBOX","DAYPRESENT","DAYABSENT","QTYCURS","QTYSALES","
       QTYSALES30","QTYSALES14","QTYIN","QTYREST","QTYLEFT","QTYINWAY","QTYPASS","QTYNEEDS","QTYORDER","
       SUMSALES","SUMWEEK","PRICE","SALESGROUP","MORIONID","MORIONNAME","CREATORID","CREATEDATE","COMMEN
       TS","UPDATEDDATE","PRICE0","PRICE1","PRICE2","PRICE3","PRICE4","PRICE5","PRICE6","LASTPRICE0","LA
       STPRICE1","LASTPRICE6","GOODSIMAGESID","PRICE_REGULATION","KRATN","RATING","MAINVENDORID","NOTUSE
       INTBARCODE","NOTUSEFACTBARCODE","SALESGROUPA","SALESGROUPB","ZAKLTXT","ZAKLDATE","ZAKLEXPIRED","C
       OLORID","SIZEID","STRUCTUREID","CAPACITY","ARTNAME","ISRECEPT","MAXPRICE","MARGINE","ISWEIGTH","P
       LUCODE","NO_PRINT_STICKER_BARCODE","UKTZ","ISBUDGET","ISTRANSIT","DEFSTICKERSCNT","TMAX","TMIN","
       SVET","DOSE","RELEASE_FORM_ID","CAPACITY_NUM","PRICEREF","NATIONAL_LIST","MIN_ASSORT","LAST_VENDO
       R_ID","SIGNEDBY","METHOD_OF_APPLICATION","BENEFITS","BONUS_ID","BONUS_FIXED","BONUS_PERCENT","WHO
       LESALEPRICE","ISNOSHARE","GOODSNAME_ID","RELEASEFORM","LIMITSALE","TURNOVER","KRATN_ORDER","OWNER
       ID","NAME_BK","PRODUCER_BK","ID_BK","LASTPRICE1_MAINVENDOR","PRICE_SEGMENTS_ID","LAST_CONTRACT_ID
       ","XYZ_TOTAL","XYZ","XYZ_QTYRATIO","XYZ_SUM2RATIO","XYZ_MARGINRATIO","XYZ_MARGIN","PROMOUTERID","
       MARKET_PRIORITY","MARKET_SIPPRICE","MARKET_BONUS_PERCENT","MARKET_BONUS_SUMMA","ANALOG_GOODSID_BY
       _NDS","NOTZAKAZFROMSUPPLIERS","ISNOTINTERNET","ISPRICE6INTERNET","CONTRAINDICATION","AGE","MARGIN
       FORINTERNET","ELEMENTSINONEITEM","MARKET_PACKET","TABLETKI_HREF","COMPENDIUM_HREF","OTHER_HREF","
       SUMREST","MINPRICE6","NAME_UC","ISGETNDSFROMGOODS","MAXCOUNTFROMONESALE" FROM "GIFT"."GOODS" "S" 
       (accessing 'OFFICE_VPN' )



По-моему, никакой особой разницы нет, даже "Plan hash value" одинаковый.
В общем, господа, единственный выход из сложившейся ситуации - ребилд таблицы после добавления новых столбцов в таблицу!
Кстати, в Oracle XE 18 всё работает нормально, похоже, что это глюк Oracle XE 11...
...
Рейтинг: 0 / 0
05.05.2020, 15:12
    #39954335
Мутаген
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает merge после добавления столбца в таблицу
Чего такое " ребилд таблицы "?
...
Рейтинг: 0 / 0
05.05.2020, 15:17
    #39954337
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает merge после добавления столбца в таблицу
slawentiy777,

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


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