Запрос времени на производство - PullRequest
0 голосов
/ 20 мая 2019

У нас есть этот запрос, в котором мы пытаемся идентифицировать клиентов с несколькими индикаторами кредитных опционов.Этот вывод запроса мы должны отразить в нашем отчете и поделиться с ним для бизнес-пользователей.Мы должны запускать этот запрос почти каждую неделю, и этот запрос занимает время.

Запрос

select CUST_ID, CUST_COUNT from (
SELECT N.CONS_ID AS CUST_ID,
COUNT(DISTINCT(case when M.CO_ID is null then 1 else m.co_id end)) AS CUST_COUNT
FROM CTS_VIEW.CNSLD_CREDIT_SUM M
INNER JOIN  CTS_VIEW.LEGACY_CODE_XREF  N
ON M.EE_ID = N.EE_GBL_IND
WHERE M.PROD_DT >= DATE '2018-12-31'
GROUP BY N.CONS_ID
  ) a
where CUST_COUNT>1;

Есть ли лучший способ написать этот запрос, который может ускорить время выполнения.Мы уже применили CBO и включили векторизацию на уровне сеанса.

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Я полагаю, что для этих целей хорошо подойдут выражения CTE или Common Table Expressions -

SELECT CUST_ID,CUST_COUNT FROM (
WITH M_RAW_CTE AS 
(SELECT CO_ID,EE_ID,PROD_DT FROM CTS_VIEW.CNSLD_CREDIT_SUM),
M_CTE AS 
(SELECT * FROM M_RAW_CTE WHERE PROD_DT >= DATE '2018-12-31'), 
N_CTE AS 
(SELECT CONS_ID,EE_GBL_IND FROM LEGACY_CODE_XREF) 

SELECT N_CTE.CONSID AS CUST_ID,
COUNT(DISTINCT(ISNULL(M.CO_ID,1))) AS CUST_COUNT
INNER JOIN N_CTE ON M_CTE.EE_ID = N_CTE.EE_GBL_IND
GROUP BY N_CTE.CONS_ID)
WHERE CUST_COUNT > 1;

концепция использования CTE заключается в повышении возможности повторного использования данных в DDL.

0 голосов
/ 20 мая 2019

Может быть, этот запрос может быть более быстрым с такой временной таблицей.В то же время вы должны проверить индекс, необходимый для этих таблиц.

SELECT N.CONS_ID AS CUST_ID,
COUNT(Distinct(Isnull(M.CO_ID,1))) AS CUST_COUNT
Into #Temp
FROM CTS_VIEW.CNSLD_CREDIT_SUM M
INNER JOIN  CTS_VIEW.LEGACY_CODE_XREF  N
ON M.EE_ID = N.EE_GBL_IND
WHERE M.PROD_DT >= DATE '2018-12-31'
GROUP BY N.CONS_ID

select CUST_ID, CUST_COUNT from 
#Temp
where CUST_COUNT>1;
...