Sql Oracle—为什么在视图中查询日期列的速度如此之慢(与表相比)?

Sql Oracle—为什么在视图中查询日期列的速度如此之慢(与表相比)?,sql,oracle11g,Sql,Oracle11g,我有一个带有几个日期列的Oracle表。各个日期列上没有显式索引,但它们确实参与了复合键。当我对基表中的任何一个日期列执行查询时,查询速度非常快(亚秒) 然后我有一个简单的视图,它只连接到另一个表。该视图的SQL在本文末尾。当我对日期列(MONTHID或HOURID)进行查询时,这是一个视图-性能非常糟糕-因此我确信正在进行全表扫描。如果我查询此视图中的任何其他列,则性能非常好。我只是想知道为什么会有不同。我尝试过各种各样的恶作剧,用暗示之类的方式,但运气不好 请帮忙 SELECT CHN_

我有一个带有几个日期列的Oracle表。各个日期列上没有显式索引,但它们确实参与了复合键。当我对基表中的任何一个日期列执行查询时,查询速度非常快(亚秒)

然后我有一个简单的视图,它只连接到另一个表。该视图的SQL在本文末尾。当我对日期列(MONTHID或HOURID)进行查询时,这是一个视图-性能非常糟糕-因此我确信正在进行全表扫描。如果我查询此视图中的任何其他列,则性能非常好。我只是想知道为什么会有不同。我尝试过各种各样的恶作剧,用暗示之类的方式,但运气不好

请帮忙

  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