sql GROUP BY花费的时间太长
由于GROUP BY,以下查询似乎没有结束 如果没有GROUP BY,它将返回记录而无需等待 你能给我一些想法试试吗 提前谢谢sql GROUP BY花费的时间太长,sql,performance,oracle,aggregate-functions,Sql,Performance,Oracle,Aggregate Functions,由于GROUP BY,以下查询似乎没有结束 如果没有GROUP BY,它将返回记录而无需等待 你能给我一些想法试试吗 提前谢谢 SELECT MPHIST_LF.ID_MEASURING_POINT AS MP_LF, MPHIST_LF.FROM_DATE AS FROM_LF, MPHIST_LF.TO_DATE AS TO_LF, RM.ID_FARE AS FARE_LF, COUNT(*
SELECT
MPHIST_LF.ID_MEASURING_POINT AS MP_LF,
MPHIST_LF.FROM_DATE AS FROM_LF,
MPHIST_LF.TO_DATE AS TO_LF,
RM.ID_FARE AS FARE_LF,
COUNT(*)
FROM RE_MPOINT_HIST MPHIST_LF
INNER JOIN ME_MEA_CTYPE_HIST CTHIST_LF ON CTHIST_LF.ID_MEASURER = MPHIST_LF.ID_MEASURER
INNER JOIN ME_MEASURER ME ON ME.ID_MEASURER = MPHIST_LF.ID_MEASURER
INNER JOIN ME_COMBINATION_USAGE_TYPE CUT ON ME.ID_COMBINATION_USAGE_TYPE = CUT.ID_COMBINATION_USAGE_TYPE
INNER JOIN ME_RATE_METER RM ON RM.ID_RATE_METER = CUT.ID_RATE_METER
WHERE CTHIST_LF.COD_USAGE_TYPE = 'AE0'
AND CUT.COD_DH = 'CODDH00001'
AND (RM.ID_FARE = 1000072 OR RM.ID_FARE = 1002253)
AND (RM.COD_GESTION IS NULL OR RM.COD_GESTION = 'TYPCLI0003')
GROUP BY MPHIST_LF.ID_MEASURING_POINT,MPHIST_LF.FROM_DATE,MPHIST_LF.TO_DATE, RM.ID_FARE
HAVING COUNT(*) = 2
GCGT_ME_MEASURER:
IDX_GCGTMEMEASURER_01 >> ID_MEASURER, RELEVANT_EQUIP
PK_GCGT_ME_MEASURER >> ID_MEASURER
IDX_GCGT_ME_MEASURER_99 >> ID_DEVICE
GCGT_ME_COMBINATION_USAGE_TYPE:
IDX_FK_ME_COM_US_TY_DEV_TY_01 >> COD_DEVICE_TYPE
PK_GCGT_ME_COMB_USAGE_TYPE >> ID_COMBINATION_USAGE_TYPE
GCGT_ME_MEA_CTYPE_HIST:
IDX_MEA_CTYPE_HIST_01 >> ID_MEASURER
IDX_MEA_CTYPE_HIST >> ID_MEA_CTYPE_HIST
GCGT_ME_RATE_METER:
IDX_FK_ME_RATE_TY_RE_SPEC_01 >> COD_SPECIALIZATION
PK_GCGT_ME_RATE_METER >> ID_RATE_METER
GCGT_RE_MPOINT_HIST:
IDX_GCGT_RE_MPOINHHIST_03 >> ID_MEASURING_POINT, ID_MEASURER, ID_MP_NATURE, ID_COMBINATION_USAGE_TYPE, ID_RATE_METER
IDX_GCGT_RE_MPOINHHIST_01 >> ID_MEASURING_POINT
IDX_GCGT_RE_MPOINHHIST_02 >> ID_MEASURER
GCGT_RE_MP_HIST_NAT_01 >> ID_MP_NATURE
IDX_MPOINT_HIST >> ID_MPOINT_HIST
Record count: 8064087, without the aggregate.
Statistcs up to date with, for instance: :::::
EXEC DBMS_STATS.GATHER_TABLE_STATS ('user', 'RE_MPOINT_HIST');
如果没有聚合函数,结果以秒为单位显示。可能不是所有的结果都显示出来了。没有聚合的计数(*)持续约20或25分钟
所有指标均已重建
---------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3970 | 302K| 4622 (1)| 00:00:56 |
| 1 | HASH GROUP BY | | 3970 | 302K| 4622 (1)| 00:00:56 |
| 2 | NESTED LOOPS | | | | | |
| 3 | NESTED LOOPS | | 3970 | 302K| 4621 (1)| 00:00:56 |
| 4 | NESTED LOOPS | | 4371 | 290K| 1997 (1)| 00:00:24 |
| 5 | NESTED LOOPS | | 2551 | 107K| 466 (0)| 00:00:06 |
| 6 | NESTED LOOPS | | 1 | 33 | 2 (0)| 00:00:01 |
| 7 | INLIST ITERATOR | | | | | |
|* 8 | TABLE ACCESS BY INDEX ROWID| GCGT_ME_RATE_METER | 1 | 21 | 1 (0)| 00:00:01 |
|* 9 | INDEX RANGE SCAN | FK_GCGT_ME_RATE_GCCOM_FARE_01 | 4 | | 1 (0)| 00:00:01 |
|* 10 | TABLE ACCESS BY INDEX ROWID | GCGT_ME_COMBINATION_USAGE_TYPE | 1 | 12 | 1 (0)| 00:00:01 |
|* 11 | INDEX RANGE SCAN | FK_ME_COM_US_TY_RATE_METER_01 | 6 | | 1 (0)| 00:00:01 |
| 12 | TABLE ACCESS BY INDEX ROWID | GCGT_ME_MEASURER | 8574 | 85740 | 464 (0)| 00:00:06 |
|* 13 | INDEX RANGE SCAN | FK_ME_MEASURER_ME_COMB_US_01 | 17368 | | 1 (0)| 00:00:01 |
| 14 | TABLE ACCESS BY INDEX ROWID | GCGT_RE_MPOINT_HIST | 2 | 50 | 1 (0)| 00:00:01 |
|* 15 | INDEX RANGE SCAN | IDX_GCGT_RE_MPOINHHIST_02 | 2 | | 1 (0)| 00:00:01 |
|* 16 | INDEX RANGE SCAN | IDX_MEA_CTYPE_HIST_01 | 3 | | 1 (0)| 00:00:01 |
|* 17 | TABLE ACCESS BY INDEX ROWID | GCGT_ME_MEA_CTYPE_HIST | 1 | 10 | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------------------
看起来很干净。没有聚合的结果有多少?没有分组依据的情况下返回多少记录?您确定它会立即返回所有视图还是仅返回第一个视图?因为“分组依据”将强制实现一些具体化,而如果没有它,DB可以流式传输结果,并更早地提供第一个结果。索引和统计信息是最新的还是最新的?你看过解释计划了吗?你能给我们看看这个问题的解释计划吗?但别忘了先收集统计数据。各个表中的哪些列有索引?然后节省的时间用于临时表的创建?或者你的意思是在查询中?谢谢