【发布时间】:2019-09-15 23:07:16
【问题描述】:
我们在生产环境中有这个查询,每天运行 它做了很多连接,还使用了 hive 中的窗口函数
我们尝试添加一些设置选项,但这并没有太大帮助
结构是这样的 -
SELECT
C.f1, C.f2, A.f2 ...
FROM (
SELECT * FROM (
SELECT T1.*, B.atid, B.a_id,
ROW_NUMBER() OVER (PARTITION BY T1.wtid, B.atid ORDER BY T1.b_ts DESC) AS RANK_
FROM T1 AS T1
JOIN T5 ON T1.t_dt = T5.t_dt
JOIN T2 B ON T1.wtid = B.wtid and T1.b_ts = B.b_ts
LEFT OUTER JOIN (SELECT p_cd FROM T3 WHERE PV_TY_CD = 'ORIG_CD') PV
ON T1.TYP = PV.p_cd
WHERE T1.state not in ("INVALID")
AND T1.evt_name NOT IN ('INACTIVE','DORMANT')
AND ISNULL(PV.p_cd)
) T
WHERE T.rank_ = 1
) A
JOIN (SELECT *, row_number() over (partition by ac_id order by b_ts desc) rank_
FROM T4
WHERE event not in ('CT','UPD')
) AS C
ON A.a_id = C.a_id
AND A.atid = C.ac_id
AND C.rank_ = 1
JOIN T6 ON C.t_dt = T6.t_dt
- 由于我不能忽略任何表(和连接),我的方法是使用聚合函数 max 将窗口函数替换为另一个连接,但我无法重写它。
- 另外,我不确定这是否肯定有助于提高性能,因此任何指导都会对我们有所帮助。
【问题讨论】:
-
如果您没有在 Tez 上运行它,请尝试一下。查询越复杂,Tez 的改进就越大。如果无法改进查询,请调整并行性:stackoverflow.com/a/48296562/2700344
标签: sql hive query-optimization hiveql