SQL优化案例-减少不必要嵌套
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)));
评论
热门帖子
- 12025-12-01浏览数:182763
- 22023-05-09浏览数:25057
- 42023-09-25浏览数:18525
- 52020-05-11浏览数:17528