powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос с merge не выполяется (выполняется очень долго)
23 сообщений из 23, страница 1 из 1
Запрос с merge не выполяется (выполняется очень долго)
    #40010593
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    merge into B24_QUEUE Q
    using
    (
    with CL as
    (
    select CLIENT_ID
    --, case when exists (select * from BM_ACTION_LOG where CUSTOMER_ID = CL.CLIENT_ID and MOMENT >= CL.MOMENT and ACTION_ID < 1000) then 1 end FL
    , case when exists (select * from BM_PAYMENT where CUSTOMER_ID = CL.CLIENT_ID and INPUT_MOMENT >= CL.MOMENT) then 1 end FP
    , case when exists (select * from SERVICES where CUSTOMER_ID = CL.CLIENT_ID and STATUS_DATE >= CL.MOMENT) then 1 end FS
    , case when exists (select * from SERVICES join BM_SERVICE_MONEY using (SERVICE_ID) where CUSTOMER_ID = CL.CLIENT_ID and MOMENT >= CL.MOMENT and MONEY != 0) then 1 end FC
    from (select CLIENT_ID, MOMENT from CYBERCOM.B24_CACHE) CL
    )
    select * from CL where coalesce(/*FL,*/FP,FS,FC) is not null
    ) D
    on (D.CLIENT_ID = Q.CLIENT_ID)
    when not matched then insert (Q.CLIENT_ID, MOMENT) values (D.CLIENT_ID, sysdate)


Внутренняя часть (using) выполняется около секунды.
А весь целиком запрос висит более минуты, затем я его прерываю.
По CLIENT_ID есть PK, число строк измеряется тысячами.
Из-за чего такая разница?
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010597
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Ответ на вопрос "что так долго выполняется" всегда один - нужно посмотреть что там так долго выполняется.
Мониторинг, ash, session waits: механизмов много.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010603
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

План посмотрите для начала. Для всего merge.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010608
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В предполагаемом плане все нормально:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
MERGE STATEMENT  ALL_ROWSCost: 93  Bytes: 28  Cardinality: 1  									
	19 MERGE B24_QUEUE 								
		18 VIEW  							
			17 NESTED LOOPS OUTER  Cost: 93  Bytes: 37  Cardinality: 1  						
				14 VIEW  Cost: 93  Bytes: 22  Cardinality: 1  					
					13 FILTER  				
						1 TABLE ACCESS FULL TABLE B24_CACHE Cost: 3  Bytes: 22  Cardinality: 1  			
						5 VIEW VIEW index$_join$_013 Cost: 90  Bytes: 182  Cardinality: 14  			
							4 HASH JOIN  		
								2 INDEX RANGE SCAN INDEX PAYMENT_CUSTOMER_IDX Cost: 3  Bytes: 182  Cardinality: 14  	
								3 INDEX RANGE SCAN INDEX PAYMENT_INPUT_MOMENT_IDX Cost: 428  Bytes: 182  Cardinality: 14  	
						7 TABLE ACCESS BY INDEX ROWID TABLE SERVICES Cost: 5  Bytes: 13  Cardinality: 1  			
							6 INDEX RANGE SCAN INDEX SERV_CUSTOMER_IDX Cost: 1  Cardinality: 5  		
						12 TABLE ACCESS BY INDEX ROWID TABLE BM_SERVICE_MONEY Cost: 15 008  Bytes: 928  Cardinality: 58  			
							11 NESTED LOOPS  Cost: 16 342  Bytes: 7 696  Cardinality: 296  		
								9 TABLE ACCESS BY INDEX ROWID TABLE SERVICES Cost: 5  Bytes: 50  Cardinality: 5  	
									8 INDEX RANGE SCAN INDEX SERV_CUSTOMER_IDX Cost: 1  Cardinality: 5  
								10 INDEX RANGE SCAN INDEX SVRM_SERVICE_IDX Cost: 332  Cardinality: 71 133  	
				16 TABLE ACCESS BY INDEX ROWID TABLE B24_QUEUE Cost: 0  Bytes: 15  Cardinality: 1  					
					15 INDEX UNIQUE SCAN INDEX (UNIQUE) B24_QUEUE_PK Cost: 0  Cardinality: 1  				

А реальный я посмотреть не могу, т.к. не дождусь выполнения запроса.

Скрипт, который выполнял этот запрос, был аварийно прерван.
Может быть остались блокировки или транзакции?
В TOAD есть Session Browser, в разделе Long Ops я своего запроса не вижу.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010611
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Внутренняя часть (using) выполняется около секунды.

Полный фетч или первые строки?
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010612
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
число строк измеряется тысячами

В обеих таблицах?

В плане

Alibek B.
Код: plsql
1.
TABLE ACCESS FULL TABLE B24_CACHE Cost: 3  Bytes: 22  Cardinality: 1

...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010613
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
В TOAD есть Session Browser, в разделе Long Ops я своего запроса не вижу.

не надо смотреть в long ops, это не про вас. находите в session browser сессию, выполняющую merge, далее current statement -> explain plan (снизу), желательно выбрать format dbms_xplan из контекстного меню. перед запуском merge выполните alter session set statistics level = all
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010618
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Полный фетч или первые строки?

Полный, запрос обычно возвращает небольшое количество строк (единицы).

env
В обеих таблицах?

В обоих таблицах возможное количество строк измеряется тысячами.

Вот такой запрос показывает, что у меня есть блокировка на таблице B24_QUEUE (lock_type=DML, mode_held=row-x). Видимо из-за прерванного ранее скрипта, подключенного к базе, который в момент прерывания работал с этой таблицей.
Нужно дождаться, пока блокировка освободится по таймауту? Или ее можно форсировать?
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010624
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Убить сессию, например, если уверены, что это ваша предыдущая.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010626
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"тысячи" строк в B24_CACHE и B24_QUEUE, но там еще неявный nested loops на эти "тысячи" итераций на BM_PAYMENT, SERVICES и BM_SERVICE_MONEY, и не факт, что там тоже тысячи строк, и что они нормально проиндексированы для таких чтений. а моментально наверняка фетчатся только первые строки, поэтому и иллюзия мгновенности.

в общем показывайте план со статстиками, и чего ждет merge, чтобы не гадать.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010631
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей,

У него блокировка. Видимо, всё гораздо проще.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010635
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня команда (alter session set statistics level = all) не работает, пишет про неверную опцию сессии (у меня Oracle 10g).
Но в explain plan указана кардинальность, на BM_SERVICE_MONEY кардинальность 70к, на остальных соединениях строк немного.
Собственно при предыдущих запусках скрипта этот запрос (с merge) выполнялся секунд 8. "Долгоиграющим" он стал сейчас, когда я скрипт прервал аварийно.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010636
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Убить сессию, например, если уверены, что это ваша предыдущая.

Сессию? Сессию я и прервать могу (отменить запрос), но блокировка ведь никуда не денется.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010637
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Сессию, которая держит блокировку.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010639
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
alter session set statistics level = all

statistics_level (пробела не должно быть).
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010644
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей
statistics_level (пробела не должно быть).

План практически полностью совпадает с тем, что я уже выкладывал вначале:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Plan
MERGE STATEMENT  ALL_ROWSCost: 93  									
	19 MERGE CYBERCOM.B24_QUEUE 								
		18 VIEW  							
			17 NESTED LOOPS OUTER  Cost: 93  Bytes: 37  Cardinality: 1  						
				14 VIEW  Cost: 93  Bytes: 22  Cardinality: 1  					
					13 FILTER  				
						1 TABLE ACCESS FULL TABLE CYBERCOM.B24_CACHE Cost: 3  Bytes: 22  Cardinality: 1  			
						5 VIEW VIEW BILLING.index$_join$_013 Cost: 90  Bytes: 182  Cardinality: 14  			
							4 HASH JOIN  		
								2 INDEX RANGE SCAN INDEX BILLING.PAYMENT_CUSTOMER_IDX Cost: 3  Bytes: 182  Cardinality: 14  	
								3 INDEX RANGE SCAN INDEX BILLING.PAYMENT_INPUT_MOMENT_IDX Cost: 428  Bytes: 182  Cardinality: 14  	
						7 TABLE ACCESS BY INDEX ROWID TABLE BILLING.SERVICES Cost: 5  Bytes: 13  Cardinality: 1  			
							6 INDEX RANGE SCAN INDEX BILLING.SERV_CUSTOMER_IDX Cost: 1  Cardinality: 5  		
						12 TABLE ACCESS BY INDEX ROWID TABLE BILLING.BM_SERVICE_MONEY Cost: 15 008  Bytes: 928  Cardinality: 58  			
							11 NESTED LOOPS  Cost: 16 342  Bytes: 7 696  Cardinality: 296  		
								9 TABLE ACCESS BY INDEX ROWID TABLE BILLING.SERVICES Cost: 5  Bytes: 50  Cardinality: 5  	
									8 INDEX RANGE SCAN INDEX BILLING.SERV_CUSTOMER_IDX Cost: 1  Cardinality: 5  
								10 INDEX RANGE SCAN INDEX BILLING.SVRM_SERVICE_IDX Cost: 332  Cardinality: 71 133  	
				16 TABLE ACCESS BY INDEX ROWID TABLE CYBERCOM.B24_QUEUE Cost: 0  Bytes: 15  Cardinality: 1  					
					15 INDEX UNIQUE SCAN INDEX (UNIQUE) CYBERCOM.B24_QUEUE_PK Cost: 0  Cardinality: 1  				


env
Сессию, которая держит блокировку.

Тогда это явно не она. Это сессия, которая сейчас висит.
А сессии, которая держит блокировку, сейчас на сервере нет.
Если выполнение запроса прервать, то запрос со списком блокировок возвращает пустой результат.
В TOAD в разделе Locks блокировки тоже появляются только когда выполняется запрос с merge. Если его отменить, то и блокировка пропадает.
А как найти, что изначально вызывает блокировку?
В waits верхние три строчки занимают log file sync, db file seq. read и db file scatter read.
Это может быть лог (откат транзакции)?

Если в моем запросе закомментировать блок, связанный с BM_SERVICE_MONEY, то весь merge выполняется быстро (секунды за 3).
То есть запрос "висит" только если внутри using используется BM_SERVICE_MONEY.
Хотя в чистом виде подзапрос внутри using выполняется быстро.
Как такое может быть?
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010652
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
План практически полностью совпадает с тем, что я уже выкладывал вначале:

нас в большей степени интересует не сам план а статистики выполнения.

пример: https://oracle-base.com/articles/9i/dbms_xplan#gather_plan_statistics_hint (на уровне запроса gather_plan_statistics работает аналогично statistics_level=all)

в TOAD session browser получить его можно, выбрав из контекстного меню current statement: display mode > dbms_xplan.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010655
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня такого нет. Есть дерево, список, диаграмма.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010657
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

тогда из вкладки information внизу возьмите sql_id и child_number, и выполните запрос
select * from table(dbms_xplan.display_cursor(sql_id => ваш sql_id, cursor_child_no=> ваш child_number, format => 'allstats last'))
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010674
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
child_number=0, а sql_id нет вообще.
Есть address и hash_value.
Если считать, что sql_id это то же, что hash_value, то результат такой:
Код: plaintext
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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
PLAN_TABLE_OUTPUT
HASH_VALUE  2497165858, child number 0
--------------------------------------
merge into CYBERCOM.B24_QUEUE Q     using     (     with CL as     (     select CLIENT_ID     --, 
case when exists (select * from BM_ACTION_LOG where CUSTOMER_ID = CL.CLIENT_ID and MOMENT > 
CL.MOMENT and ACTION_ID < 1000) then 1 end FL     , case when exists (select * from BM_PAYMENT where 
CUSTOMER_ID = CL.CLIENT_ID and INPUT_MOMENT > CL.MOMENT) then 1 end FP     , case when exists 
(select * from SERVICES where CUSTOMER_ID = CL.CLIENT_ID and STATUS_DATE > CL.MOMENT) then 1 end FS  
   , case when exists (select * from SERVICES join BM_SERVICE_MONEY using (SERVICE_ID) where 
CUSTOMER_ID = CL.CLIENT_ID and MOMENT > CL.MOMENT and MONEY != 0) then 1 end FC     from (select 
CLIENT_ID, MOMENT from CYBERCOM.B24_CACHE) CL     )     select * from CL where 
coalesce(/*FL,*/FP,FS,FC) is not null     ) D     on (D.CLIENT_ID = Q.CLIENT_ID)     when not 
matched then insert (Q.CLIENT_ID, MOMENT) values (D.CLIENT_ID, sysdate)
 
Plan hash value: 558666016
 
-------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name                     | E-Rows |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------
|   1 |  MERGE                               | B24_QUEUE                |        |       |       |          |
|   2 |   VIEW                               |                          |        |       |       |          |
|   3 |    NESTED LOOPS OUTER                |                          |      1 |       |       |          |
|   4 |     VIEW                             |                          |      1 |       |       |          |
|*  5 |      FILTER                          |                          |        |       |       |          |
|   6 |       TABLE ACCESS FULL              | B24_CACHE                |      1 |       |       |          |
|*  7 |       VIEW                           | index$_join$_013         |     14 |       |       |          |
|*  8 |        HASH JOIN                     |                          |        |  1078K|  1078K|          |
|*  9 |         INDEX RANGE SCAN             | PAYMENT_CUSTOMER_IDX     |     14 |       |       |          |
|* 10 |         INDEX RANGE SCAN             | PAYMENT_INPUT_MOMENT_IDX |     14 |       |       |          |
|* 11 |        TABLE ACCESS BY INDEX ROWID   | SERVICES                 |      1 |       |       |          |
|* 12 |         INDEX RANGE SCAN             | SERV_CUSTOMER_IDX        |      5 |       |       |          |
|* 13 |         TABLE ACCESS BY INDEX ROWID  | BM_SERVICE_MONEY         |     58 |       |       |          |
|  14 |          NESTED LOOPS                |                          |    296 |       |       |          |
|  15 |           TABLE ACCESS BY INDEX ROWID| SERVICES                 |      5 |       |       |          |
|* 16 |            INDEX RANGE SCAN          | SERV_CUSTOMER_IDX        |      5 |       |       |          |
|* 17 |           INDEX RANGE SCAN           | SVRM_SERVICE_IDX         |  71133 |       |       |          |
|  18 |     TABLE ACCESS BY INDEX ROWID      | B24_QUEUE                |      1 |       |       |          |
|* 19 |      INDEX UNIQUE SCAN               | B24_QUEUE_PK             |      1 |       |       |          |
-------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   5 - filter(COALESCE(CASE  WHEN  IS NOT NULL THEN 1 END ,CASE  WHEN  IS NOT NULL THEN 1 END ,CASE  
              WHEN  IS NOT NULL THEN 1 END ) IS NOT NULL)
   7 - filter(("CUSTOMER_ID"=:B1 AND "INPUT_MOMENT">:B2))
   8 - access(ROWID=ROWID)
   9 - access("CUSTOMER_ID"=:B1)
  10 - access("INPUT_MOMENT">:B1)
  11 - filter("STATUS_DATE">:B1)
  12 - access("CUSTOMER_ID"=:B1)
  13 - filter(("BM_SERVICE_MONEY"."MONEY"<>0 AND "BM_SERVICE_MONEY"."MOMENT">:B1))
  16 - access("SERVICES"."CUSTOMER_ID"=:B1)
  17 - access("SERVICES"."SERVICE_ID"="BM_SERVICE_MONEY"."SERVICE_ID")
  19 - access("D"."CLIENT_ID"="Q"."CLIENT_ID")
 
Note
-----
   - Warning: basic plan statistics not available. These are only collected when:
       * hint 'gather_plan_statistics' is used for the statement or
       * parameter 'statistics_level' is set to 'ALL', at session or system level
 
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010675
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Код: plaintext
1.
2.
   - Warning: basic plan statistics not available. These are only collected when:
       * hint 'gather_plan_statistics' is used for the statement or
       * parameter 'statistics_level' is set to 'ALL', at session or system level

alter session забыли? ну или хинт в merge вставьте.
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010677
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не забыл, выполнял перед запросом.
Хинт это /*+ GATHER_PLAN_STATISTICS */ ? Добавлять к merge?
Что-то не вижу эффекта:
Код: plaintext
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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
PLAN_TABLE_OUTPUT
HASH_VALUE  1050332861, child number 0
--------------------------------------
merge /*+ GATHER_PLAN_STATISTICS */ into CYBERCOM.B24_QUEUE Q     using     (     with CL as     (   
  select CLIENT_ID     --, case when exists (select * from BM_ACTION_LOG where CUSTOMER_ID = 
CL.CLIENT_ID and MOMENT > CL.MOMENT and ACTION_ID < 1000) then 1 end FL     , case when exists 
(select * from BM_PAYMENT where CUSTOMER_ID = CL.CLIENT_ID and INPUT_MOMENT > CL.MOMENT) then 1 end 
FP     , case when exists (select * from SERVICES where CUSTOMER_ID = CL.CLIENT_ID and STATUS_DATE > 
CL.MOMENT) then 1 end FS     , case when exists (select * from SERVICES join BM_SERVICE_MONEY using 
(SERVICE_ID) where CUSTOMER_ID = CL.CLIENT_ID and MOMENT > CL.MOMENT and MONEY != 0) then 1 end FC   
  from (select CLIENT_ID, MOMENT from CYBERCOM.B24_CACHE) CL     )     select * from CL where 
coalesce(/*FL,*/FP,FS,FC) is not null     ) D     on (D.CLIENT_ID = Q.CLIENT_ID)     when not 
matched then insert (Q.CLIENT_ID, MOMENT) values (D.CLIENT_ID, sysdate)
 
Plan hash value: 558666016
 
-------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name                     | E-Rows |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------
|   1 |  MERGE                               | B24_QUEUE                |        |       |       |          |
|   2 |   VIEW                               |                          |        |       |       |          |
|   3 |    NESTED LOOPS OUTER                |                          |      1 |       |       |          |
|   4 |     VIEW                             |                          |      1 |       |       |          |
|*  5 |      FILTER                          |                          |        |       |       |          |
|   6 |       TABLE ACCESS FULL              | B24_CACHE                |      1 |       |       |          |
|*  7 |       VIEW                           | index$_join$_013         |     14 |       |       |          |
|*  8 |        HASH JOIN                     |                          |        |  1078K|  1078K|          |
|*  9 |         INDEX RANGE SCAN             | PAYMENT_CUSTOMER_IDX     |     14 |       |       |          |
|* 10 |         INDEX RANGE SCAN             | PAYMENT_INPUT_MOMENT_IDX |     14 |       |       |          |
|* 11 |        TABLE ACCESS BY INDEX ROWID   | SERVICES                 |      1 |       |       |          |
|* 12 |         INDEX RANGE SCAN             | SERV_CUSTOMER_IDX        |      5 |       |       |          |
|* 13 |         TABLE ACCESS BY INDEX ROWID  | BM_SERVICE_MONEY         |     58 |       |       |          |
|  14 |          NESTED LOOPS                |                          |    296 |       |       |          |
|  15 |           TABLE ACCESS BY INDEX ROWID| SERVICES                 |      5 |       |       |          |
|* 16 |            INDEX RANGE SCAN          | SERV_CUSTOMER_IDX        |      5 |       |       |          |
|* 17 |           INDEX RANGE SCAN           | SVRM_SERVICE_IDX         |  71133 |       |       |          |
|  18 |     TABLE ACCESS BY INDEX ROWID      | B24_QUEUE                |      1 |       |       |          |
|* 19 |      INDEX UNIQUE SCAN               | B24_QUEUE_PK             |      1 |       |       |          |
-------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   5 - filter(COALESCE(CASE  WHEN  IS NOT NULL THEN 1 END ,CASE  WHEN  IS NOT NULL THEN 1 END ,CASE  
              WHEN  IS NOT NULL THEN 1 END ) IS NOT NULL)
   7 - filter(("CUSTOMER_ID"=:B1 AND "INPUT_MOMENT">:B2))
   8 - access(ROWID=ROWID)
   9 - access("CUSTOMER_ID"=:B1)
  10 - access("INPUT_MOMENT">:B1)
  11 - filter("STATUS_DATE">:B1)
  12 - access("CUSTOMER_ID"=:B1)
  13 - filter(("BM_SERVICE_MONEY"."MONEY"<>0 AND "BM_SERVICE_MONEY"."MOMENT">:B1))
  16 - access("SERVICES"."CUSTOMER_ID"=:B1)
  17 - access("SERVICES"."SERVICE_ID"="BM_SERVICE_MONEY"."SERVICE_ID")
  19 - access("D"."CLIENT_ID"="Q"."CLIENT_ID")
 
Note
-----
   - Warning: basic plan statistics not available. These are only collected when:
       * hint 'gather_plan_statistics' is used for the statement or
       * parameter 'statistics_level' is set to 'ALL', at session or system level
 
...
Рейтинг: 0 / 0
Запрос с merge не выполяется (выполняется очень долго)
    #40010701
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал с exists на left join с группировкой, плюс по возможности оптимизировал.
Так работает за приемлемое время (в пределах 5 секунд).
Код: 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.
    merge into B24_QUEUE Q
    using
    (
    select CL.CLIENT_ID, coalesce(FP.M, FS.M, FC.M, FL.M) as MOMENT
    from B24_CACHE CL
    left join
      (
      select CUSTOMER_ID as C, max(INPUT_MOMENT) as M
      from BM_PAYMENT
      where INPUT_MOMENT > trunc(sysdate)-50
      group by CUSTOMER_ID
      ) FP on (FP.C = CL.CLIENT_ID and FP.M > CL.MOMENT)
    left join
      (
      select CUSTOMER_ID as C, max(STATUS_DATE) as M
      from SERVICES
      where STATUS_DATE > trunc(sysdate)-50
      group by CUSTOMER_ID
      ) FS on (FS.C = CL.CLIENT_ID and FS.M > CL.MOMENT)
    left join
      (
      select S.CUSTOMER_ID as C, max(SM.MOMENT) as M
      from SERVICES S
      join BM_SERVICE_MONEY SM on (SM.SERVICE_ID = S.SERVICE_ID)
      where SM.MOMENT > trunc(sysdate)-50
      and SM.FDATE > trunc(sysdate)-50
      and SM.MONEY != 0
      group by S.CUSTOMER_ID
      ) FC on (FC.C = CL.CLIENT_ID and FC.M > CL.MOMENT)
    left join
      (
      select CUSTOMER_ID as C, max(MOMENT) as M
      from BM_ACTION_LOG
      where MOMENT > trunc(sysdate)-50
      and ACTION_ID < 1000
      group by CUSTOMER_ID
      ) FL on (FL.C = CL.CLIENT_ID and FL.M > CL.MOMENT)
    where coalesce(FP.M,FS.M,FC.M,FL.M) is not null
    ) D
    on (D.CLIENT_ID = Q.CLIENT_ID)
    when not matched then insert (Q.CLIENT_ID, MOMENT) values (D.CLIENT_ID, sysdate)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос с merge не выполяется (выполняется очень долго)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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