-1

下面的查询需要很长时间才能执行。它使用 tez 执行引擎运行。

SELECT STG.EMP_TYPE, DEPT, A.TOTAL_COUNT, COUNT(DISTINCT EMP_ID) AS COUNT_DEPT
FROM 
STAGE_SOURCE STG 
LEFT OUTER JOIN 
( SELECT EMP_TYPE, COUNT(DISTINCT EMP_ID) AS TOTAL_COUNT 
  FROM STAGE_SOURCE 
  GROUP BY EMP_TYPE 
) A
ON STG.EMP_TYPE = A.EMP_TYPE
GROUP BY STG.EMP_TYPE, DEPT, A.TOTAL_COUNT;

是否有任何重写选项或优化策略可以提高查询性能?

4

2 回答 2

0

通过了解您的查询,我能够理解您需要 2 个值的计数。首先,每个 EMP_TYPE 下的 EMP_ID 的计数,其次。DEPT 和 EMP_TYPE 下的 EMP_ID 计数

SELECT 

STG.EMP_TYPE, 
DEPT,
TOTAL_COUNT, 
COUNT(EMP_ID) AS COUNT_DEPT

FROM 
STAGE_SOURCE STG 
JOIN 
( SELECT EMP_TYPE, COUNT(EMP_ID) AS TOTAL_COUNT 
  FROM STAGE_SOURCE 
  GROUP BY EMP_TYPE 
) A
ON STG.EMP_TYPE = A.EMP_TYPE
GROUP BY STG.EMP_TYPE, DEPT,TOTAL_COUNT;

尽可能使用 GROUP BY 而不是 DISTINCT 可以减少运行时间。正如上面“考虑我”所提到的,GROUP BY 利用了索引。

于 2015-12-14T11:10:19.000 回答
0

我建议只获取一次表记录。

您的内部聚合计算可以使用窗口函数来完成。

我相信这个查询应该给你相同的结果,你会摆脱JOIN.

SELECT
    EMP_TYPE,
    DEPT,
    COUNT( DISTINCT EMP_ID ) OVER ( PARTITION BY EMP_TYPE ) AS TOTAL_COUNT,
    COUNT( DISTINCT EMP_ID ) AS COUNT_DEPT
FROM
    STAGE_SOURCE
GROUP BY EMP_TYPE, DEPT

请记住,aGROUP BY也可以利用索引。

这是有关窗口和分析功能的 Apache Hive 手册的链接

#在评论后编辑

至少在窗口函数聚合计算之后应用 inPostgreSQL子句DISTINCT,导致我们进行一些利用,这可能会为您提供所需的东西。这样我们就摆脱了GROUP BY. 看看它在 Postgres 上是如何工作的:SQLFiddle

试试下面的查询:

SELECT
    DISTINCT
    EMP_TYPE,
    DEPT,
    COUNT( DISTINCT EMP_ID ) OVER ( PARTITION BY EMP_TYPE ) AS TOTAL_COUNT,
    COUNT( DISTINCT EMP_ID ) OVER ( PARTITION BY EMP_TYPE, DEPT ) AS COUNT_DEPT
FROM
    STAGE_SOURCE

#编辑 2

SELECT
    DISTINCT
    EMP_TYPE,
    DEPT,
    COUNT( DISTINCT EMP_ID ) OVER ( PARTITION BY EMP_TYPE ) AS TOTAL_COUNT,
    COUNT( DISTINCT EMP_ID ) OVER ( PARTITION BY EMP_TYPE, DEPT ) AS COUNT_DEPT
FROM (
    SELECT DISTINCT EMP_TYPE, DEPT, EMP_ID FROM STAGE_SOURCE
    ) foo
于 2015-12-13T22:25:40.513 回答