【发布时间】:2017-03-07 05:15:04
【问题描述】:
我有 2 个表,它们都有开始日期和结束日期。这两个表都由一个名为 cust_id 的列关联。我加入这些表以获取特定列并通过应用于一个表的日期范围来限制它。无论日期范围是 4 天还是 1 小时,我都看到查询需要 50-55 秒。我假设当我提供更小的日期范围时,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');
在我观察到相同行为的不同环境中针对类似表运行查询:
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: 由于没有足够的访问权限,我无法查找 EXPLAIN PLAN。
【问题讨论】:
-
如果无法访问基本诊断工具,例如解释计划或 SQL 监视器,您的所有答案都将是猜测。我鼓励您访问这些工具,以便我们更好地为您提供帮助。
-
嗨@BobC。我从一个不同的环境运行了一个解释计划,在那里我看到了类似的行为。