sql—查询在生产中占用时间

iih3973s  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(214)

我们有这个查询,我们试图确定客户与多个信贷选择指标。我们必须在报表中反映此查询输出,并将其共享给业务用户。我们几乎每周都要运行这个查询,而且这个查询需要时间。
查询

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并启用了矢量化。

dl5txlt9

dl5txlt91#

使用这样的临时表,这个查询可能会更快。同时,应该检查这些表所需的索引。

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;
kr98yfug

kr98yfug2#

我认为cte或通用表表达式将有助于实现这些目标-

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中数据的可重用性。

相关问题