Sql Oracle—为什么在视图中查询日期列的速度如此之慢(与表相比)?
我有一个带有几个日期列的Oracle表。各个日期列上没有显式索引,但它们确实参与了复合键。当我对基表中的任何一个日期列执行查询时,查询速度非常快(亚秒) 然后我有一个简单的视图,它只连接到另一个表。该视图的SQL在本文末尾。当我对日期列(MONTHID或HOURID)进行查询时,这是一个视图-性能非常糟糕-因此我确信正在进行全表扫描。如果我查询此视图中的任何其他列,则性能非常好。我只是想知道为什么会有不同。我尝试过各种各样的恶作剧,用暗示之类的方式,但运气不好 请帮忙Sql Oracle—为什么在视图中查询日期列的速度如此之慢(与表相比)?,sql,oracle11g,Sql,Oracle11g,我有一个带有几个日期列的Oracle表。各个日期列上没有显式索引,但它们确实参与了复合键。当我对基表中的任何一个日期列执行查询时,查询速度非常快(亚秒) 然后我有一个简单的视图,它只连接到另一个表。该视图的SQL在本文末尾。当我对日期列(MONTHID或HOURID)进行查询时,这是一个视图-性能非常糟糕-因此我确信正在进行全表扫描。如果我查询此视图中的任何其他列,则性能非常好。我只是想知道为什么会有不同。我尝试过各种各样的恶作剧,用暗示之类的方式,但运气不好 请帮忙 SELECT CHN_
SELECT CHN_SLOC_HOUR_FACT.UTILITYID,
chn_sloc_hour_fact.MONTHID,
chn_sloc_hour_fact.hourid,
CHN_SLOC_HOUR_FACT.METERID,
CHN_SLOC_HOUR_FACT.CH_V_AVG_A_MIN,
CHN_SLOC_HOUR_FACT.CH_V_AVG_A_MAX,
CHN_SLOC_HOUR_FACT.CH_V_AVG_A_AVG,
SERVICELOCATION.GEOMETRY
FROM CHN_SLOC_HOUR_FACT
INNER JOIN SERVICELOCATION
ON SERVICELOCATION.ID = CHN_SLOC_HOUR_FACT.SERVICE_LOCATION_ID;
更新:
基表查询
查询SQL:
select *
from chn_sloc_hour_fact
where utilityid = 6
and monthid = to_date('01-Mar-14','DD-MON-YY')
and hourid = to_date('03-Mar-14 12:00:00','DD-MON-YY HH24:MI:SS')
计划表输出
Plan hash value: 2202514416
-----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12298 | 12M| 13709 (1)| 00:00:01 | | |
|* 1 | TABLE ACCESS BY GLOBAL INDEX ROWID| CHN_SLOC_HOUR_FACT | 12298 | 12M| 13709 (1)| 00:00:01 | ROWID | ROWID |
|* 2 | INDEX SKIP SCAN | CHN_SLOC_HOUR_FACT_UK1 | 26 | | 13361 (1)| 00:00:01 | | |
-----------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("UTILITYID"=6)
2 - access("MONTHID"=TO_DATE('01-Mar-14','DD-MON-YY') AND "HOURID"=TO_DATE('03-Mar-14 12:00:00','DD-MON-YY
HH24:MI:SS'))
filter("HOURID"=TO_DATE('03-Mar-14 12:00:00','DD-MON-YY HH24:MI:SS') AND
"MONTHID"=TO_DATE('01-Mar-14','DD-MON-YY'))
Plan hash value: 245188272
------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12298 | 2810K| 13904 (1)| 00:00:01 | | |
|* 1 | HASH JOIN | | 12298 | 2810K| 13904 (1)| 00:00:01 | | |
|* 2 | TABLE ACCESS BY GLOBAL INDEX ROWID| CHN_SLOC_HOUR_FACT | 12298 | 540K| 13709 (1)| 00:00:01 | ROWID | ROWID |
|* 3 | INDEX SKIP SCAN | CHN_SLOC_HOUR_FACT_UK1 | 26 | | 13361 (1)| 00:00:01 | | |
| 4 | TABLE ACCESS FULL | SERVICELOCATION | 35123 | 6482K| 195 (2)| 00:00:01 | | |
------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("SERVICELOCATION"."ID"="CHN_SLOC_HOUR_FACT"."SERVICE_LOCATION_ID")
2 - filter("CHN_SLOC_HOUR_FACT"."UTILITYID"=6)
3 - access("CHN_SLOC_HOUR_FACT"."MONTHID"=TO_DATE('01-Mar-14','DD-MON-YY') AND
"CHN_SLOC_HOUR_FACT"."HOURID"=TO_DATE('03-Mar-14 12:00:00','DD-MON-YY HH24:MI:SS'))
filter("CHN_SLOC_HOUR_FACT"."HOURID"=TO_DATE('03-Mar-14 12:00:00','DD-MON-YY HH24:MI:SS') AND
"CHN_SLOC_HOUR_FACT"."MONTHID"=TO_DATE('01-Mar-14','DD-MON-YY'))
查看查询:
查询SQL:
select *
from gis_servicelocation_hour_dist
where utilityid = 6
and monthid = to_date('01-Mar-14','DD-MON-YY')
and hourid = to_date('03-Mar-14 12:00:00','DD-MON-YY HH24:MI:SS')
计划表输出
Plan hash value: 2202514416
-----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12298 | 12M| 13709 (1)| 00:00:01 | | |
|* 1 | TABLE ACCESS BY GLOBAL INDEX ROWID| CHN_SLOC_HOUR_FACT | 12298 | 12M| 13709 (1)| 00:00:01 | ROWID | ROWID |
|* 2 | INDEX SKIP SCAN | CHN_SLOC_HOUR_FACT_UK1 | 26 | | 13361 (1)| 00:00:01 | | |
-----------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("UTILITYID"=6)
2 - access("MONTHID"=TO_DATE('01-Mar-14','DD-MON-YY') AND "HOURID"=TO_DATE('03-Mar-14 12:00:00','DD-MON-YY
HH24:MI:SS'))
filter("HOURID"=TO_DATE('03-Mar-14 12:00:00','DD-MON-YY HH24:MI:SS') AND
"MONTHID"=TO_DATE('01-Mar-14','DD-MON-YY'))
Plan hash value: 245188272
------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12298 | 2810K| 13904 (1)| 00:00:01 | | |
|* 1 | HASH JOIN | | 12298 | 2810K| 13904 (1)| 00:00:01 | | |
|* 2 | TABLE ACCESS BY GLOBAL INDEX ROWID| CHN_SLOC_HOUR_FACT | 12298 | 540K| 13709 (1)| 00:00:01 | ROWID | ROWID |
|* 3 | INDEX SKIP SCAN | CHN_SLOC_HOUR_FACT_UK1 | 26 | | 13361 (1)| 00:00:01 | | |
| 4 | TABLE ACCESS FULL | SERVICELOCATION | 35123 | 6482K| 195 (2)| 00:00:01 | | |
------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("SERVICELOCATION"."ID"="CHN_SLOC_HOUR_FACT"."SERVICE_LOCATION_ID")
2 - filter("CHN_SLOC_HOUR_FACT"."UTILITYID"=6)
3 - access("CHN_SLOC_HOUR_FACT"."MONTHID"=TO_DATE('01-Mar-14','DD-MON-YY') AND
"CHN_SLOC_HOUR_FACT"."HOURID"=TO_DATE('03-Mar-14 12:00:00','DD-MON-YY HH24:MI:SS'))
filter("CHN_SLOC_HOUR_FACT"."HOURID"=TO_DATE('03-Mar-14 12:00:00','DD-MON-YY HH24:MI:SS') AND
"CHN_SLOC_HOUR_FACT"."MONTHID"=TO_DATE('01-Mar-14','DD-MON-YY'))
请向我们展示慢速和快速查询的执行计划(请使用格式化的纯文本,无图片),谢谢您的关注。请参阅更新后的帖子。这两种说法的作用不同。第一个视图仅从
chn\u sloc\u hour\u fact
中选择,而视图包括SERVICELOCATION
表。当您执行select*
Oracle无法从查询中删除servicelocation
(而完整表扫描正是影响您的原因)。尝试仅显式选择来自chn\u sloc\u hour\u fact
表的列。也许优化器足够聪明,可以从查询计划中删除servicevcelocation
。