Sql Oracle查询连接时速度慢,拆分为两个查询时速度快

Sql Oracle查询连接时速度慢,拆分为两个查询时速度快,sql,performance,oracle,query-optimization,sql-execution-plan,Sql,Performance,Oracle,Query Optimization,Sql Execution Plan,我有一个sql查询,它在连接两个表时非常慢,但在第一次查询一个表并使用其输出查询另一个表时速度很快 环境/先决条件 Oracle版本: Oracle数据库11g企业版11.2.0.3.0版-64位生产 涉及的对象: cfc_物化(物化视图,2150万行) 触点(表,12,6百万行) 涉及的索引: 在联系人(客户端)上创建索引联系人(客户端) 在CFC_MATERIALIZED上创建索引CFC_MATERIALIZED(关联类型、源ID、目标ID) 我已经用cascade=>true重新计算了这两

我有一个sql查询,它在连接两个表时非常慢,但在第一次查询一个表并使用其输出查询另一个表时速度很快

环境/先决条件

Oracle版本:
Oracle数据库11g企业版11.2.0.3.0版-64位生产

涉及的对象:
cfc_物化(物化视图,2150万行)
触点(表,12,6百万行)

涉及的索引:
在联系人(客户端)上创建索引联系人(客户端)
在CFC_MATERIALIZED上创建索引CFC_MATERIALIZED(关联类型、源ID、目标ID)

我已经用cascade=>true重新计算了这两个表的统计数据:

BEGIN
  SYS.DBMS_STATS.GATHER_TABLE_STATS (
     OwnName        => '...'
    ,TabName        => '...'
    ,Estimate_Percent  => 0
    ,Degree            => 4
    ,Cascade           => TRUE
    ,No_Invalidate     => FALSE);
END;
/
问题

我有以下疑问:

SELECT c.*
FROM contact c
WHERE c.client in (
    SELECT cfc.targetid
    FROM cfc_materialized cfc
    WHERE cfc.sourceid = 'e95027f0-a83e-11e3-a0ae-005056aebabc'
      AND cfc.association_type = 'ContactDataSharing'
  )
  AND c.deleted = 0;
解释计划:

--------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name             | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                  |    11M|  2214M| 38976   (1)| 00:07:48 |        |      |            |
|   1 |  PX COORDINATOR                |                  |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)          | :TQ10001         |       |       |            |          |  Q1,01 | P->S | QC (RAND)  |
|   3 |    NESTED LOOPS                |                  |       |       |            |          |  Q1,01 | PCWP |            |
|   4 |     NESTED LOOPS               |                  |    11M|  2214M| 38976   (1)| 00:07:48 |  Q1,01 | PCWP |            |
|   5 |      SORT UNIQUE               |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,01 | PCWP |            |
|   6 |       PX RECEIVE               |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,01 | PCWP |            |
|   7 |        PX SEND HASH            | :TQ10000         |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | P->P | HASH       |
|   8 |         PX BLOCK ITERATOR      |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | PCWC |            |
|*  9 |          MAT_VIEW ACCESS FULL  | CFC_MATERIALIZED |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | PCWP |            |
|* 10 |      INDEX RANGE SCAN          | CONTACT_CLIENT   |  5500 |       |    37   (0)| 00:00:01 |  Q1,01 | PCWP |            |
|* 11 |     TABLE ACCESS BY INDEX ROWID| CONTACT          |  5474 |   550K|   973   (0)| 00:00:12 |  Q1,01 | PCWP |            |
--------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   9 - filter("CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc' AND "CFC"."ASSOCIATION_TYPE"='ContactDataSharing')
  10 - access("C"."CLIENT"="CFC"."TARGETID")
  11 - filter("C"."DELETED"=0)enter code here
-------------------------------------------------------------------------------------------
| Id  | Operation        | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                        |  2164 |   196K|    36   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| CFC_MATERIALIZED_A_S_T |  2164 |   196K|    36   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("CFC"."ASSOCIATION_TYPE"='ContactDataSharing' AND 
              "CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc')
-----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                |  2814 |   283K|   505   (0)| 00:00:07 |
|   1 |  INLIST ITERATOR             |                |       |       |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID| CONTACT        |  2814 |   283K|   505   (0)| 00:00:07 |
|*  3 |    INDEX RANGE SCAN          | CONTACT_CLIENT |  2827 |       |    23   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("C"."DELETED"=0)
   3 - access("C"."CLIENT"='e95027f0-a83e-11e3-a0ae-005056aebabc' OR 
              "C"."CLIENT"='eb37d3b0-a83e-11e3-a0ae-005056aebabc')
-------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                        |    11M|  2214M|   305K  (1)| 01:01:09 |
|   1 |  NESTED LOOPS                |                        |       |       |            |          |
|   2 |   NESTED LOOPS               |                        |    11M|  2214M|   305K  (1)| 01:01:09 |
|   3 |    SORT UNIQUE               |                        |  2164 |   196K|    36   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN         | CFC_MATERIALIZED_A_S_T |  2164 |   196K|    36   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN          | CONTACT_CLIENT         |  5500 |       |    37   (0)| 00:00:01 |
|*  6 |   TABLE ACCESS BY INDEX ROWID| CONTACT                |  5474 |   550K|   973   (0)| 00:00:12 |
-------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("CFC"."ASSOCIATION_TYPE"='ContactDataSharing' AND 
              "CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc')
   5 - access("C"."CLIENT"="CFC"."TARGETID")
   6 - filter("C"."DELETED"=0)
这需要相当长的时间,我想知道为什么有一个完全访问cfc_实现。 当我将查询分为两个查询时,速度要快得多。 第一个问题:

SELECT cfc.targetid
FROM cfc_materialized cfc
WHERE cfc.sourceid = 'e95027f0-a83e-11e3-a0ae-005056aebabc'
  AND cfc.association_type = 'ContactDataSharing';
此查询返回2个targetID。 解释计划:

--------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name             | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                  |    11M|  2214M| 38976   (1)| 00:07:48 |        |      |            |
|   1 |  PX COORDINATOR                |                  |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)          | :TQ10001         |       |       |            |          |  Q1,01 | P->S | QC (RAND)  |
|   3 |    NESTED LOOPS                |                  |       |       |            |          |  Q1,01 | PCWP |            |
|   4 |     NESTED LOOPS               |                  |    11M|  2214M| 38976   (1)| 00:07:48 |  Q1,01 | PCWP |            |
|   5 |      SORT UNIQUE               |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,01 | PCWP |            |
|   6 |       PX RECEIVE               |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,01 | PCWP |            |
|   7 |        PX SEND HASH            | :TQ10000         |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | P->P | HASH       |
|   8 |         PX BLOCK ITERATOR      |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | PCWC |            |
|*  9 |          MAT_VIEW ACCESS FULL  | CFC_MATERIALIZED |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | PCWP |            |
|* 10 |      INDEX RANGE SCAN          | CONTACT_CLIENT   |  5500 |       |    37   (0)| 00:00:01 |  Q1,01 | PCWP |            |
|* 11 |     TABLE ACCESS BY INDEX ROWID| CONTACT          |  5474 |   550K|   973   (0)| 00:00:12 |  Q1,01 | PCWP |            |
--------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   9 - filter("CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc' AND "CFC"."ASSOCIATION_TYPE"='ContactDataSharing')
  10 - access("C"."CLIENT"="CFC"."TARGETID")
  11 - filter("C"."DELETED"=0)enter code here
-------------------------------------------------------------------------------------------
| Id  | Operation        | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                        |  2164 |   196K|    36   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| CFC_MATERIALIZED_A_S_T |  2164 |   196K|    36   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("CFC"."ASSOCIATION_TYPE"='ContactDataSharing' AND 
              "CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc')
-----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                |  2814 |   283K|   505   (0)| 00:00:07 |
|   1 |  INLIST ITERATOR             |                |       |       |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID| CONTACT        |  2814 |   283K|   505   (0)| 00:00:07 |
|*  3 |    INDEX RANGE SCAN          | CONTACT_CLIENT |  2827 |       |    23   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("C"."DELETED"=0)
   3 - access("C"."CLIENT"='e95027f0-a83e-11e3-a0ae-005056aebabc' OR 
              "C"."CLIENT"='eb37d3b0-a83e-11e3-a0ae-005056aebabc')
-------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                        |    11M|  2214M|   305K  (1)| 01:01:09 |
|   1 |  NESTED LOOPS                |                        |       |       |            |          |
|   2 |   NESTED LOOPS               |                        |    11M|  2214M|   305K  (1)| 01:01:09 |
|   3 |    SORT UNIQUE               |                        |  2164 |   196K|    36   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN         | CFC_MATERIALIZED_A_S_T |  2164 |   196K|    36   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN          | CONTACT_CLIENT         |  5500 |       |    37   (0)| 00:00:01 |
|*  6 |   TABLE ACCESS BY INDEX ROWID| CONTACT                |  5474 |   550K|   973   (0)| 00:00:12 |
-------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("CFC"."ASSOCIATION_TYPE"='ContactDataSharing' AND 
              "CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc')
   5 - access("C"."CLIENT"="CFC"."TARGETID")
   6 - filter("C"."DELETED"=0)
这里是第二个问题。我使用第一次查询的输出作为IN参数的输入:

SELECT *
FROM contact c
WHERE c.client in (
    'e95027f0-a83e-11e3-a0ae-005056aebabc',
    'eb37d3b0-a83e-11e3-a0ae-005056aebabc'
  )
  AND c.deleted = 0;
解释计划:

--------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name             | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                  |    11M|  2214M| 38976   (1)| 00:07:48 |        |      |            |
|   1 |  PX COORDINATOR                |                  |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)          | :TQ10001         |       |       |            |          |  Q1,01 | P->S | QC (RAND)  |
|   3 |    NESTED LOOPS                |                  |       |       |            |          |  Q1,01 | PCWP |            |
|   4 |     NESTED LOOPS               |                  |    11M|  2214M| 38976   (1)| 00:07:48 |  Q1,01 | PCWP |            |
|   5 |      SORT UNIQUE               |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,01 | PCWP |            |
|   6 |       PX RECEIVE               |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,01 | PCWP |            |
|   7 |        PX SEND HASH            | :TQ10000         |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | P->P | HASH       |
|   8 |         PX BLOCK ITERATOR      |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | PCWC |            |
|*  9 |          MAT_VIEW ACCESS FULL  | CFC_MATERIALIZED |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | PCWP |            |
|* 10 |      INDEX RANGE SCAN          | CONTACT_CLIENT   |  5500 |       |    37   (0)| 00:00:01 |  Q1,01 | PCWP |            |
|* 11 |     TABLE ACCESS BY INDEX ROWID| CONTACT          |  5474 |   550K|   973   (0)| 00:00:12 |  Q1,01 | PCWP |            |
--------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   9 - filter("CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc' AND "CFC"."ASSOCIATION_TYPE"='ContactDataSharing')
  10 - access("C"."CLIENT"="CFC"."TARGETID")
  11 - filter("C"."DELETED"=0)enter code here
-------------------------------------------------------------------------------------------
| Id  | Operation        | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                        |  2164 |   196K|    36   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| CFC_MATERIALIZED_A_S_T |  2164 |   196K|    36   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("CFC"."ASSOCIATION_TYPE"='ContactDataSharing' AND 
              "CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc')
-----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                |  2814 |   283K|   505   (0)| 00:00:07 |
|   1 |  INLIST ITERATOR             |                |       |       |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID| CONTACT        |  2814 |   283K|   505   (0)| 00:00:07 |
|*  3 |    INDEX RANGE SCAN          | CONTACT_CLIENT |  2827 |       |    23   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("C"."DELETED"=0)
   3 - access("C"."CLIENT"='e95027f0-a83e-11e3-a0ae-005056aebabc' OR 
              "C"."CLIENT"='eb37d3b0-a83e-11e3-a0ae-005056aebabc')
-------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                        |    11M|  2214M|   305K  (1)| 01:01:09 |
|   1 |  NESTED LOOPS                |                        |       |       |            |          |
|   2 |   NESTED LOOPS               |                        |    11M|  2214M|   305K  (1)| 01:01:09 |
|   3 |    SORT UNIQUE               |                        |  2164 |   196K|    36   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN         | CFC_MATERIALIZED_A_S_T |  2164 |   196K|    36   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN          | CONTACT_CLIENT         |  5500 |       |    37   (0)| 00:00:01 |
|*  6 |   TABLE ACCESS BY INDEX ROWID| CONTACT                |  5474 |   550K|   973   (0)| 00:00:12 |
-------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("CFC"."ASSOCIATION_TYPE"='ContactDataSharing' AND 
              "CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc')
   5 - access("C"."CLIENT"="CFC"."TARGETID")
   6 - filter("C"."DELETED"=0)
问题

所以我的问题是,为什么CBO不以类似于在两个查询中手动执行查询的方式执行查询?我还尝试了带有提示的查询,以使用与两个查询相同的索引:

SELECT /*+ index(c CONTACT_CLIENT) */ c.*
FROM contact c
WHERE c.client in (
    SELECT /*+ index(cfc CFC_MATERIALIZED_A_S_T) */ cfc.targetid
    FROM cfc_materialized cfc
    WHERE cfc.sourceid = 'e95027f0-a83e-11e3-a0ae-005056aebabc'
      AND cfc.association_type = 'ContactDataSharing'
  )
  AND c.deleted = 0;
但我得到了一个更糟糕的解释计划:

--------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name             | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                  |    11M|  2214M| 38976   (1)| 00:07:48 |        |      |            |
|   1 |  PX COORDINATOR                |                  |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)          | :TQ10001         |       |       |            |          |  Q1,01 | P->S | QC (RAND)  |
|   3 |    NESTED LOOPS                |                  |       |       |            |          |  Q1,01 | PCWP |            |
|   4 |     NESTED LOOPS               |                  |    11M|  2214M| 38976   (1)| 00:07:48 |  Q1,01 | PCWP |            |
|   5 |      SORT UNIQUE               |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,01 | PCWP |            |
|   6 |       PX RECEIVE               |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,01 | PCWP |            |
|   7 |        PX SEND HASH            | :TQ10000         |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | P->P | HASH       |
|   8 |         PX BLOCK ITERATOR      |                  |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | PCWC |            |
|*  9 |          MAT_VIEW ACCESS FULL  | CFC_MATERIALIZED |  2164 |   196K| 10672   (1)| 00:02:09 |  Q1,00 | PCWP |            |
|* 10 |      INDEX RANGE SCAN          | CONTACT_CLIENT   |  5500 |       |    37   (0)| 00:00:01 |  Q1,01 | PCWP |            |
|* 11 |     TABLE ACCESS BY INDEX ROWID| CONTACT          |  5474 |   550K|   973   (0)| 00:00:12 |  Q1,01 | PCWP |            |
--------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   9 - filter("CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc' AND "CFC"."ASSOCIATION_TYPE"='ContactDataSharing')
  10 - access("C"."CLIENT"="CFC"."TARGETID")
  11 - filter("C"."DELETED"=0)enter code here
-------------------------------------------------------------------------------------------
| Id  | Operation        | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                        |  2164 |   196K|    36   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| CFC_MATERIALIZED_A_S_T |  2164 |   196K|    36   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("CFC"."ASSOCIATION_TYPE"='ContactDataSharing' AND 
              "CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc')
-----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                |  2814 |   283K|   505   (0)| 00:00:07 |
|   1 |  INLIST ITERATOR             |                |       |       |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID| CONTACT        |  2814 |   283K|   505   (0)| 00:00:07 |
|*  3 |    INDEX RANGE SCAN          | CONTACT_CLIENT |  2827 |       |    23   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("C"."DELETED"=0)
   3 - access("C"."CLIENT"='e95027f0-a83e-11e3-a0ae-005056aebabc' OR 
              "C"."CLIENT"='eb37d3b0-a83e-11e3-a0ae-005056aebabc')
-------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                        |    11M|  2214M|   305K  (1)| 01:01:09 |
|   1 |  NESTED LOOPS                |                        |       |       |            |          |
|   2 |   NESTED LOOPS               |                        |    11M|  2214M|   305K  (1)| 01:01:09 |
|   3 |    SORT UNIQUE               |                        |  2164 |   196K|    36   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN         | CFC_MATERIALIZED_A_S_T |  2164 |   196K|    36   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN          | CONTACT_CLIENT         |  5500 |       |    37   (0)| 00:00:01 |
|*  6 |   TABLE ACCESS BY INDEX ROWID| CONTACT                |  5474 |   550K|   973   (0)| 00:00:12 |
-------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("CFC"."ASSOCIATION_TYPE"='ContactDataSharing' AND 
              "CFC"."SOURCEID"='e95027f0-a83e-11e3-a0ae-005056aebabc')
   5 - access("C"."CLIENT"="CFC"."TARGETID")
   6 - filter("C"."DELETED"=0)
我还尝试使用join而不是IN子句,如Alexander和StanislavL所建议的:

SELECT c.*
FROM contact c
JOIN cfc_materialized cfc ON c.client = cfc.targetid
WHERE cfc.sourceid = 'e95027f0-a83e-11e3-a0ae-005056aebabc'
  AND cfc.association_type = 'ContactDataSharing'
  AND c.deleted = 0;
得到了下面的解释计划,它同样非常慢(比两个单独的查询慢):


在中使用join而不是
,以避免对
中的每一行计算相同的查询,其中
主要是避免对
联系人
表进行完全表访问。 避免
c.*
,指定具体的列列表。 重建索引

在CFC\u物化(TARGETID、关联类型、源ID)上创建索引CFC\u物化\u S\T

控制连接顺序访问


让我知道。

为什么您认为查询会被计算不止一次?而且,我相信,
cfc\u上的索引会具体化。这里需要targetid