sql查询在配置单元中运行需要很长时间,有什么方法可以简化它吗

ruoxqz4g  于 2021-06-28  发布在  Hive
关注(0)|答案(1)|浏览(321)

我正在寻找一些帮助,关于一个sql查询,我正试图在hive(hue平台)中运行,并正在寻找一些建议,看看查询是否可以缩短或编写不同的方式,使其运行更快。当我在sql developer中对一个虚拟数据集(1500行)运行这个(见下文)时,它运行得非常快,并提供了我所需要的:

SELECT 
    P_AGENT,
    TRUNC(P_DATE) AS P_DATE,
    SUM(TOUCH_COUNT) AS TOUCH_COUNT,   
    MIN(P_DATE) AS START_TIME,
    MAX(P_DATE) AS END_TIME,
    MAX(P_DATE) - MIN(P_DATE) AS TIME_TAKEN
FROM 
    (
    SELECT 
        T1.*,
        SUM(COUNT1) OVER (PARTITION BY P_AGENT, TRUNC(P_DATE) ORDER BY P_DATE) AS GRP,
        CASE  
            WHEN P_DATE - LAG(P_DATE) OVER (PARTITION BY P_AGENT, TRUNC(P_DATE) ORDER BY P_DATE) <= 1 / 48  
            THEN NULL
            ELSE 1
         END AS TOUCH_COUNT
    FROM 
        (
          SELECT 
            T1.*,
            (CASE WHEN P_DATE - LAG(P_DATE) OVER (PARTITION BY P_AGENT, TRUNC(P_DATE) ORDER BY P_DATE) <= 1/48  
             THEN 0 ELSE 1
            END) AS COUNT1
          FROM 
            TABLE2 T1
        ) T1
    ) T1
GROUP BY
    P_AGENT, TRUNC(P_DATE), GRP
ORDER BY
    P_DATE
    ;

不幸的是,当我尝试在配置单元中运行同一个查询时,查询需要很长时间才能运行,我最多运行了7个小时,但仍然没有输出。问题是,我正试图对一个有超过3亿行的表运行此操作,因此它所花费的时间很长。
我决定分解查询并将初始子查询放入一个表中(下面显示的是虚拟数据),这很好,我现在在一个有3.47亿行的子表中的输出(下面的虚拟数据只显示了10行)
创建表

CREATE TABLE "TIME_ISSUES" 
   (    
    "P_DATE" DATE, 
    "P_AGENT" VARCHAR2(8 BYTE), 
    "COUNT1" NUMBER(5,0)
   )

插入语句

Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('05-APR-16 20:20:12','DD-MON-RR HH24:MI:SS'),'CLQRC0',1); 
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('07-APR-16 15:06:09','DD-MON-RR HH24:MI:SS'),'SMCXF3',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('08-APR-16 04:33:00','DD-MON-RR HH24:MI:SS'),'EAQGH1',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('08-APR-16 12:17:53','DD-MON-RR HH24:MI:SS'),'JMENJDS',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('09-APR-16 13:06:53','DD-MON-RR HH24:MI:SS'),'JMENJDS',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('11-APR-16 10:41:00','DD-MON-RR HH24:MI:SS'),'NUKXY3',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('12-APR-16 10:15:21','DD-MON-RR HH24:MI:SS'),'JMRJADS',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('12-APR-16 11:19:23','DD-MON-RR HH24:MI:SS'),'CLMXB1',1); 
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('15-APR-16 08:36:00','DD-MON-RR HH24:MI:SS'),'EMA0L1',1);  
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('22-APR-16 16:22:00','DD-MON-RR HH24:MI:SS'),'EADBM1',1);

不幸的是,初始表有49个不同的列,但是我选择了上面示例中使用的2个列。
我发现在运行第二个子查询时,问题似乎出在语句中:

SUM(COUNT1) OVER (PARTITION BY P_AGENT, TRUNC(P_DATE) ORDER BY P_DATE) AS GRP,

我正在运行的完整查询如下所示:

SELECT T1.*,
  SUM(COUNT1) OVER (PARTITION BY P_AGENT, TO_DATE(P_DATE) ORDER BY P_DATE) AS GRP,
  CASE
    WHEN P_DATE - LAG(P_DATE) over (PARTITION BY P_RECR, TO_DATE(P_DATE) ORDER BY P_DATE) <= 1 / 48
    THEN NULL
    ELSE 1
  END AS TOUCH_COUNT
FROM TIME_ISSUES T1 ;

但这需要时间运行,所以我想一些建议,看看是否有什么不同,我可以尝试,因为我被困在如何解决这个问题。
我要寻找的输出将显示代理在30分钟时间内完成的所有工作。
我的数据集中的一个例子是:

P_AGENT | P_DATE | TOUCH_COUNT | START_TIME | END _TIME | TIME_TAKEN
JMRJADS | 12-APR-16 | 1 | 12-APR-16 10:15:21 | 12-APR-16 10:15:21 | 0
ar7v8xwq

ar7v8xwq1#

在上一阶段已经计算count1时,不需要触摸计数

相关问题