У меня есть два набора данных, поступающих из внешнего источника - дата покупки клиента и последняя дата клика/открытия клиентом по электронной почте. Он хранится в двух таблицах PURCHASE_INTER и ACTIVITY_INTER соответственно. Данные о покупке несколько, и мне нужно забрать последнюю дату покупки. Но данные о деятельности уникальны для каждого клиента. Данные не зависят друг от друга, и другой набор данных может отсутствовать. Мы составили ниже запрос, который объединяет две таблицы, группирует их на основе person_id, который является идентификатором клиента, поступающего из внешнего источника, и получает последние даты, присоединяется к нашей таблице клиентов, чтобы получить электронную почту клиента и снова присоединиться к другой таблице где эти данные будут в конечном счете сохранены для того, чтобы знать, является ли это вставкой или операцией обновления. Не могли бы вы предложить, как я могу улучшить производительность этого запроса. Это ужасно медленно и занимает более 10 часов. В таблицах PURCHASE_INTER и ACTIVITY_INTER представлены миллионы записей.Улучшение производительности
SELECT INTER.*, C.ID AS CUSTOMER_ID, C.EMAIL AS CUSTOMER_EMAIL, LSI.ID AS INTERACTION_ID, ROW_NUMBER() OVER (ORDER BY PERSON_ID ASC) AS RN FROM (
SELECT PERSON_ID AS PERSON_ID,
MAX(LAST_CLICK_DATE) AS LAST_CLICK_DATE,
MAX(LAST_OPEN_DATE) AS LAST_OPEN_DATE,
MAX(LAST_PURCHASE_DATE) AS LAST_PURCHASE_DATE
FROM (
SELECT ACT.PERSON_ID AS PERSON_ID,
ACT.LAST_CLICK_DATE AS LAST_CLICK_DATE,
ACT.LAST_OPEN_DATE AS LAST_OPEN_DATE,
NULL AS LAST_PURCHASE_DATE
FROM ACTIVITY_INTER ACT
WHERE ACT.JOB_ID = 77318317
UNION
SELECT PUR.PERSON_ID AS PERSON_ID,
NULL AS LAST_CLICK_DATE,
NULL AS LAST_OPEN_DATE,
PUR.LAST_PURCHASE_DATE AS LAST_PURCHASE_DATE
FROM PURCHASE_INTER PUR
WHERE PUR.JOB_ID = 77318317
) GROUP BY PERSON_ID
) INTER LEFT JOIN CUSTOMER C ON INTER.PERSON_ID = C.PERSON_ID
LEFT JOIN INTERACTION LSI ON C.ID = LSI.CUSTOMER_ID;
Вам нужно удалить дубликаты, или вы можете использовать 'UNION ALL' вместо' UNION'? – jarlh
Сколько записей соответствует заданию? –
Вам действительно нужно предоставить столбец 'RN'? Это может быть дорого стоить, если вы возвращаете большое количество строк. –