Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос с merge не выполяется (выполняется очень долго) / 23 сообщений из 23, страница 1 из 1
21.10.2020, 17:04
    #40010593
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
Есть такой запрос:
Код: 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
21.10.2020, 17:09
    #40010597
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
Alibek B.,

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

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

Код: 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
21.10.2020, 17:36
    #40010611
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
Alibek B.
Внутренняя часть (using) выполняется около секунды.

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

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

В плане

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

...
Рейтинг: 0 / 0
21.10.2020, 17:40
    #40010613
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
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
21.10.2020, 17:47
    #40010618
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
env
Полный фетч или первые строки?

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

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

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

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

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

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

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

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

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

statistics_level (пробела не должно быть).
...
Рейтинг: 0 / 0
21.10.2020, 18:22
    #40010644
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
кит северных морей
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
21.10.2020, 18:40
    #40010652
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
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
21.10.2020, 18:43
    #40010655
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
У меня такого нет. Есть дерево, список, диаграмма.
...
Рейтинг: 0 / 0
21.10.2020, 18:47
    #40010657
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
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
21.10.2020, 19:32
    #40010674
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
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
21.10.2020, 19:35
    #40010675
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
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
21.10.2020, 19:45
    #40010677
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
Не забыл, выполнял перед запросом.
Хинт это /*+ 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
21.10.2020, 22:27
    #40010701
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с merge не выполяется (выполняется очень долго)
Переделал с 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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос с merge не выполяется (выполняется очень долго) / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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