powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / exists или join с группировкой?
3 сообщений из 3, страница 1 из 1
exists или join с группировкой?
    #40002036
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю синхронизацию ИС с битриксом.
У битрикса имеется ограничение по частоте запросов, а в ИС нет событий.
Поэтому синхронизацию делаю периодическим получением исходных данных с определением изменившихся записей.
В таблице CL дата предыдущей синхронизации хранится в поле MOMENT, соответственно мне нужно найти записи, у которых были изменения после MOMENT.

Есть такой запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with CL as (...)
select CLIENT_ID
, L.LAST as LAST_LOG
, P.LAST as LAST_PAYMENT
, S.LAST as LAST_STATUS
, C.LAST as LAST_CHARGE
from CL
left join (
select CL.CLIENT_ID, max(L.MOMENT) as LAST
from CL join BM_ACTION_LOG L on (L.CUSTOMER_ID = CL.CLIENT_ID and L.MOMENT >= CL.MOMENT and L.ACTION_ID < 1000)
group by CL.CLIENT_ID
) L using (CLIENT_ID)
...
where coalesce(L.LAST, P.LAST, S.LAST, C.LAST) is not null



Его можно сделать и так:
Код: plsql
1.
2.
3.
4.
5.
6.
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 FLAG_LOG
, case when exists (select * from BM_PAYMENT where CUSTOMER_ID = CL.CLIENT_ID and INPUT_MOMENT >= CL.MOMENT) then 1 end FLAG_PAYMENT
, case when exists (select * from SERVICES where CUSTOMER_ID = CL.CLIENT_ID and STATUS_DATE >= CL.MOMENT) then 1 end FLAG_STATUS
, 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 FLAG_CHARGE
from (...) CL



На тестовых данных он и выполняется быстрее, и explain plan выглядет проще.
Но меня когда-то давно учили избегать сложных подзапросов в select.

Не подскажите, в данном случае какой способ лучше?
Некоторые проверяемые наборы данных могут быть немаленькими (десятки миллионов записей), хотя по используемым полям есть индексы.
...
Рейтинг: 0 / 0
exists или join с группировкой?
    #40002086
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

Когда оперативные данные нужно получать из лога, это отвратно спроектированная система.
...
Рейтинг: 0 / 0
exists или join с группировкой?
    #40002133
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

я exist писал иначе (возможно из-за непонимания case when exists () ...)

,(select 1 from dual where exists (select * from BM_ACTION_LOG where CUSTOMER_ID = CL.CLIENT_ID and MOMENT >= CL.MOMENT and ACTION_ID < 1000)) FLAG_LOG
...

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


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