GBase 8a
性能调优
文章

SQL优化案例-减少不必要嵌套

发表于2024-10-30 17:19:1487次浏览0个评论

 GBase 8a处理子查询需要建立临时表存放中间结果,多一层子查询则会多出一次临时表结果集物化过程,减少嵌套层次即可减少SQL整体的物化开销,从而提高性能。

例如:以下某项目案例语句,将group部分移到内部,减少嵌套,性能提升约4倍。

原始SQL:

SELECT YEAR,
      Sum(JANUARY)   JANUARY,
      Sum(FEBRUARY)  FEBRUARY,
      Sum(MARCH)     MARCH,
      Sum(APRIL)     APRIL,
      Sum(MAY)       MAY,
      Sum(JUNE)      JUNE,
      Sum(JULY)      JULY,
      Sum(AUGUST)    AUGUST,
      Sum(SEPTEMBER) SEPTEMBER,
      Sum(OCTOBER)   OCTOBER,
      Sum(NOVEMBER)  NOVEMBER,
      Sum(DECEMBER)  DECEMBER,
      Sum(BAE089)    MONTHS
FROM   (SELECT AAE003,
              To_char(To_number(Substr(AAE003, 0, 4))) YEAR,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '01' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  JANUARY,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '02' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  FEBRUARY,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '03' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  MARCH,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '04' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  APRIL,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '05' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  MAY,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '06' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  JUNE,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '07' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  JULY,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '08' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  AUGUST,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '09' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  SEPTEMBER,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '10' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  OCTOBER,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '11' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  NOVEMBER,
              ( CASE
                  WHEN Substr(AAE003, 5, 6) = '12' THEN Nvl(AAE180, 0)
                  ELSE 0
                END )                                  DECEMBER,
              BAE089
       FROM   AC08
       WHERE  AAC001 = 4000000002252449
              AND AAE140 IN ( 1, '110', '120' )
              AND AAA115 NOT IN ( '25' )
) A
GROUP  BY YEAR

>>>>>>>>>>>>>>>>>>>>>>>>>修改为>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

SELECT TO_CHAR(TO_NUMBER(SUBSTR(AAE003, 0, 4))) YEAR,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '01' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) JANUARY,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '02' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) FEBRUARY,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '03' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) MARCH,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '04' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) APRIL,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '05' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) MAY,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '06' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) JUNE,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '07' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) JULY,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '08' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) AUGUST,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '09' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) SEPTEMBER,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '10' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) OCTOBER,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '11' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) NOVEMBER,SUM(CASE
             WHEN SUBSTR(AAE003, 5, 6) = '12' THEN
              NVL(AAE180, 0)
             ELSE
              0
          END) DECEMBER
 FROM AC08
WHERE AAC001 = 4000000002252449
  AND AAE140 IN (1, '110', '120')
  AND AAA115 NOT IN ('25')
GROUP BY TO_CHAR(TO_NUMBER(SUBSTR(AAE003, 0, 4)));

评论

登录后才可以发表评论