有关优化此多层(具有多层子查询)SQL查询的提示

时间:2017-12-01 16:38:39

标签: sql subquery amazon-redshift query-performance

我需要您对此SQL查询的帮助。我有一个包含6层子查询的查询,这些子查询目前的结构如下。我期待着建议如何:

  1. 在不重复相同陈述的情况下缩小图层(例如,我可以替换'当E> 200''时的情况(当T2.BB> 100然后B +时的情况) C else B + D end)>'并在第1层写入语句,因此消除了layer2。我不能这样做,因为在我的原始查询中我有一个基于另一个计算列的计算列在其子查询中,然后根据子子查询中的另一个计算列计算...所以重复代码5/6时间会让我感到困惑并让我发疯...

  2. 避免使用select 2. ,选择1。,同时仍保留最终输出中的所有列(F,E,A,B,C,D,T2.BB)。我想这样做是因为在我的原始查询中有5个选择。* - 我觉得这会导致服务器做很多冗余工作并减慢查询执行速度。

  3. 非常感谢你的帮助!

    Select 
        2.*,
        case when E > 200 then 'OK' else 'OH NO' end F
    From
        (Select 
             1.*,
             Case when T2.BB >100 then B+C else B+D end E
         From
             (Select
                  A, B, C, D, T2.BB
              From 
                  T1
              Join 
                  T2 on T1.A = T2.AA) 1
        ) 2
    

1 个答案:

答案 0 :(得分:0)

尝试使用WITH语句,它们看起来更干净,因为它们有助于维护应用逻辑的顺序,所以它看起来像这样:

WITH
t1 as (
    select ...
    from src_table
)
,t2 as (
    select *, ...
    from t1
)
<<as much layers as needed>>

如果您需要在两个不同的地方重用某些东西,您可以从任何后面的语句中引用先前的WITH语句,即将该逻辑封装在一个地方