【问题标题】:Query taking time on production查询生产耗时
【发布时间】:2019-05-20 10:56:32
【问题描述】:

我们有这个查询,我们试图通过多个信用选项指标来识别客户。我们必须将这个查询输出反映在我们的报告中并分享给业务用户。我们几乎每周都必须运行这个查询,而且这个查询需要时间。

查询

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 并在会话级别启用了矢量化。

【问题讨论】:

  • 您的查询是指视图。这可能是性能问题的原因。
  • 请提供 EXPLAIN 输出

标签: sql hive query-optimization hiveql


【解决方案1】:

也许这个查询可以用这样的临时表更快。同时,您应该检查这些表所需的索引。

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;

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2011-11-03
      • 2015-10-23
      • 2012-11-04
      • 2013-07-24
      • 2015-09-08
      相关资源
      最近更新 更多