【发布时间】:2014-08-18 16:19:53
【问题描述】:
如何提高以下查询的性能?目前需要 35 分钟。
-- Select
SELECT
RPT_FT_MD_FLOWS.FECDATA, RPT_FT_MC_CONTR.L2V,
RPT_FT_MD_FLOWS.CODCONT, SUM(RPT_FT_MD_FLOWS.IMPMOCMP)
FROM
RPT_FT_MD_FLOWS,
RPT_FT_MC_CONTR
WHERE
-- joins
RPT_FT_MD_FLOWS.IDGRUEMP = RPT_FT_MC_CONTR.IDGRUEMP AND
RPT_FT_MD_FLOWS.FECDATA = RPT_FT_MC_CONTR.FECDATA AND
RPT_FT_MD_FLOWS.CODCONT = RPT_FT_MC_CONTR.CODCONT AND
RPT_FT_MD_FLOWS.IDEMPR = RPT_FT_MC_CONTR.IDEMPR AND
RPT_FT_MD_FLOWS.IDCENT = RPT_FT_MC_CONTR.IDCENT AND
RPT_FT_MD_FLOWS.CODPROD = RPT_FT_MC_CONTR.CODPROD AND
RPT_FT_MD_FLOWS.IDCONTR = RPT_FT_MC_CONTR.IDCONTR AND
RPT_FT_MD_FLOWS.IDSCONTR = RPT_FT_MC_CONTR.IDSCONTR AND
-- filters
RPT_FT_MD_FLOWS.FECDATA = '31-May-2014' AND
RPT_FT_MD_FLOWS.IDGRUEMP = '0022' AND
RPT_FT_MD_FLOWS.ACUMTEMP = 'MTH' AND
RPT_FT_MD_FLOWS.IDESCENA = '01' AND
RPT_FT_MD_FLOWS.CODCONT='CCPP'
--group by
GROUP BY
RPT_FT_MD_FLOWS.FECDATA,
RPT_FT_MC_CONTR.L2V,
RPT_FT_MD_FLOWS.CODCONT
-
RPT_FT_MC_CONTR:3900 万行 -
RPT_FT_MD_FLOWS:1.45 亿行
这里是解释命令的结果:
解释命令
Execution Plan
----------------------------------------------------------
Plan hash value: 2459895390
------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 268 | 29212 | 30846 (8)| 00:09:16 | | | | | |
| 1 | PX COORDINATOR | | | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10002 | 268 | 29212 | 30846 (8)| 00:09:16 | | | Q1,02 | P->S | QC (RAND) |
| 3 | HASH GROUP BY | | 268 | 29212 | 30846 (8)| 00:09:16 | | | Q1,02 | PCWP | |
| 4 | PX RECEIVE | | 268 | 29212 | 30846 (8)| 00:09:16 | | | Q1,02 | PCWP | |
| 5 | PX SEND HASH | :TQ10001 | 268 | 29212 | 30846 (8)| 00:09:16 | | | Q1,01 | P->P | HASH |
| 6 | HASH GROUP BY | | 268 | 29212 | 30846 (8)| 00:09:16 | | | Q1,01 | PCWP | |
|* 7 | HASH JOIN | | 39M| 4127M| 30586 (7)| 00:09:11 | | | Q1,01 | PCWP | |
| 8 | PX BLOCK ITERATOR | | 39M| 1893M| 10659 (4)| 00:03:12 | 1 | 16 | Q1,01 | PCWC | |
|* 9 | TABLE ACCESS FULL | RPT_FT_MC_CONTR | 39M| 1893M| 10659 (4)| 00:03:12 | 833 | 848 | Q1,01 | PCWP | |
| 10 | PX RECEIVE | | 145M| 8184M| 19806 (9)| 00:05:57 | | | Q1,01 | PCWP | |
| 11 | PX SEND BROADCAST LOCAL| :TQ10000 | 145M| 8184M| 19806 (9)| 00:05:57 | | | Q1,00 | P->P | BCST LOCAL |
| 12 | PX BLOCK ITERATOR | | 145M| 8184M| 19806 (9)| 00:05:57 | 66 | 66 | Q1,00 | PCWC | |
|* 13 | TABLE ACCESS FULL | RPT_FT_MD_FLOWS | 145M| 8184M| 19806 (9)| 00:05:57 | 66 | 66 | Q1,00 | PCWP | |
------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
7 - access("RPT_FT_MD_FLOWS"."CODCONT"="RPT_FT_MC_CONTR"."CODCONT" AND "RPT_FT_MD_FLOWS"."FECDATA"="RPT_FT_MC_CONTR"."FECDATA" AND
"RPT_FT_MD_FLOWS"."IDGRUEMP"="RPT_FT_MC_CONTR"."IDGRUEMP" AND "RPT_FT_MD_FLOWS"."IDEMPR"="RPT_FT_MC_CONTR"."IDEMPR" AND
"RPT_FT_MD_FLOWS"."IDCENT"="RPT_FT_MC_CONTR"."IDCENT" AND "RPT_FT_MD_FLOWS"."CODPROD"="RPT_FT_MC_CONTR"."CODPROD" AND
"RPT_FT_MD_FLOWS"."IDCONTR"="RPT_FT_MC_CONTR"."IDCONTR" AND "RPT_FT_MD_FLOWS"."IDSCONTR"="RPT_FT_MC_CONTR"."IDSCONTR")
9 - filter("RPT_FT_MC_CONTR"."IDGRUEMP"='0022' AND "RPT_FT_MC_CONTR"."FECDATA"=TO_DATE(' 2014-05-31 00:00:00', 'syyyy-mm-dd
hh24:mi:ss'))
13 - filter("RPT_FT_MD_FLOWS"."IDESCENA"='01' AND "RPT_FT_MD_FLOWS"."FECDATA"=TO_DATE(' 2014-05-31 00:00:00', 'syyyy-mm-dd
hh24:mi:ss') AND "RPT_FT_MD_FLOWS"."IDGRUEMP"='0022' AND "RPT_FT_MD_FLOWS"."ACUMTEMP"='MTH')
【问题讨论】:
-
感谢 Chris 的编辑,现在看起来很清晰
-
您的连接语法是ancient,您需要修复它。
-
为什么要在这么多条件下加入 2 个表?
-
这是业务报告要求
-
@nkalis 如果只有两张桌子,您只需加入将桌子放在一起的项目。加入表后,您无需添加更多谓词。他们有什么共同的ID吗?你也有任何索引,因为它似乎没有被使用。
标签: sql query-performance