我有两个表都有开始日期和结束日期。这两个表都与名为cust_id的列相关联。我加入这些表来获取特定的列并按日期范围限制它应用于一个表上。不管日期范围是4天还是1小时,我都会看到查询需要50-55秒。当我提供更小的日期范围时,我假定Oracle需要解析的行数较少。这是预期的行为,还是我应该查找一些东西?Oracle - 调整具有日期范围的查询
select to_char(t.start_ts,'YYYY-MM-DD HH24:MI'),
COUNT(CASE WHEN f.fault = 'N' THEN 1 END) success,
COUNT(CASE WHEN f.fault = 'Y' THEN 1 END) failure
from customer t,profile f where 1=1
and t.cust_id = f.cust_id
and to_char(t.start_ts,'YYYY-MM-DD HH24:MI:SS') between '2017-03-01 00:00:00'
and '2017-05-01 23:59:59'
group by to_char(t.start_ts,'YYYY-MM-DD HH24:MI')
order by to_char(t.start_ts,'YYYY-MM-DD HH24:MI');
然在不同的Env对类似表的查询我在那里观察相同的行为:
Plan hash value: 2851258613
---------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 362 | 11651 (1)| 00:00:01 | | |
| 1 | SORT GROUP BY | | 2 | 362 | 11651 (1)| 00:00:01 | | |
| 2 | NESTED LOOPS | | 2 | 362 | 11650 (1)| 00:00:01 | | |
| 3 | NESTED LOOPS | | 2 | 362 | 11650 (1)| 00:00:01 | | |
| 4 | PARTITION RANGE ALL | | 2 | 284 | 11644 (1)| 00:00:01 | 1 | 41 |
|* 5 | TABLE ACCESS BY LOCAL INDEX ROWID| TXNS | 2 | 284 | 11644 (1)| 00:00:01 | 1 | 41 |
|* 6 | INDEX SKIP SCAN | XIE1TXNS | 4 | | 11641 (1)| 00:00:01 | 1 | 41 |
|* 7 | INDEX RANGE SCAN | XAK1FRONTEND_DTLS | 1 | | 2 (0)| 00:00:01 | | |
| 8 | TABLE ACCESS BY GLOBAL INDEX ROWID | FRONTEND_DTLS | 1 | 39 | 3 (0)| 00:00:01 | ROWID | ROWID |
---------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - filter("T"."SRVC_NAME"='ControllerSvc' AND "T"."SRVC_VERSION"='10.00' AND
"T"."SRC_SERV_ID"<>'test' AND "T"."SRC_SERV_ID"<>'endtoendtesting' AND "T"."SRVR_NODE_NAME" NOT LIKE
'%test.net' AND "T"."SRC_SERV_ID"<>'test' AND "T"."SRC_SERV_ID"<>'SYN')
6 - access("T"."SRVC_OP_NAME"='getTestInfo')
filter("T"."SRVC_OP_NAME"='getTestInfo' AND TO_CHAR(INTERNAL_FUNCTION("T"."START_TS"),'YYYY-MM-DD
HH24:MI:SS')>='2017-03-01 00:00:00' AND TO_CHAR(INTERNAL_FUNCTION("T"."START_TS"),'YYYY-MM-DD
HH24:MI:SS')<='2017-05-01 23:59:59')
7 - access("T"."TXN_ID"="F"."TXN_ID")
PS: 我无法查找解释计划,因为我没有足够的访问。
没有获得基本的诊断工具,如解释计划或能力SQL监视器,你所有的答案将是猜测。我鼓励你访问这些工具,以便我们更好地帮助你。 – BobC
Hi @BobC。我从一个不同的env开始了解释计划,我在那里看到类似的行为。 –