Oracle SQL-使用dblink时未发生视图推送谓词

Oracle SQL-使用dblink时未发生视图推送谓词,sql,oracle,view,sql-execution-plan,database-link,Sql,Oracle,View,Sql Execution Plan,Database Link,我在执行以下查询Q1时遇到性能问题: 小表b2包含大约200条记录,所有列都是varchar2 执行Q1有很好的表现,执行计划如下: Plan hash value: 2906430222 --------------------------------------------------------

我在执行以下查询Q1时遇到性能问题:

小表b2包含大约200条记录,所有列都是varchar2

执行Q1有很好的表现,执行计划如下:

Plan hash value: 2906430222                                                                                                  

-----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name                | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                     |     1 |   274 |    64   (0)| 00:00:01 |       |       |
|*  1 |  COUNT STOPKEY                        |                     |       |       |            |          |       |       |
|   2 |   NESTED LOOPS                        |                     |     1 |   274 |    64   (0)| 00:00:01 |       |       |
|   3 |    PARTITION LIST ALL                 |                     |     1 |    22 |    59   (0)| 00:00:01 |     1 |     2 |
|   4 |     PARTITION RANGE ALL               |                     |     1 |    22 |    59   (0)| 00:00:01 |     1 |  LAST |
|   5 |      TABLE ACCESS BY LOCAL INDEX ROWID| ORDERS              |     1 |    22 |    59   (0)| 00:00:01 |     1 |    29 |
|*  6 |       INDEX RANGE SCAN                | IDX_ORDERS_CREATED  |     1 |       |    57   (0)| 00:00:01 |     1 |    29 |
|   7 |    VIEW PUSHED PREDICATE              | TEST                |     1 |   252 |     5   (0)| 00:00:01 |       |       |
|*  8 |     FILTER                            |                     |       |       |            |          |       |       |
|   9 |      SORT AGGREGATE                   |                     |     1 |    55 |            |          |       |       |
|  10 |       NESTED LOOPS                    |                     |   259 | 14245 |     5   (0)| 00:00:01 |       |       |
|* 11 |        INDEX UNIQUE SCAN              | PK_ID               |     1 |    14 |     2   (0)| 00:00:01 |       |       |
|* 12 |        INDEX STORAGE FAST FULL SCAN   | IDX_MN_AN_AD_ALL    |   259 | 10619 |     3   (0)| 00:00:01 |       |       |
-----------------------------------------------------------------------------------------------------------------------------

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

   1 - filter(ROWNUM<10)                                                                                                     
   6 - access("A_OUT"."CREATED">TRUNC(SYSDATE@!))                                                                     
   8 - filter(COUNT(*)>0)                                                                                                    
  11 - access("ID"="A_OUT"."ID")                                                                                       
  12 - storage("B2"."ATTR_1"=NVL(CASE  WHEN SUBSTR("ID",(-1))<'5' THEN 'YYY' END ,'#') OR "B2"."ATTR_1"='*')              
       filter("B2"."ATTR_1"=NVL(CASE  WHEN SUBSTR("ID",(-1))<'5' THEN 'YYY' END ,'#') OR "B2"."ATTR_1"='*')               
我希望视图被访问n次,就像在第一个场景中一样。 我尝试使用提示,但没有成功

可以这样说,即使有行和exists,也可以从中选择1dual@db2在视图中没有注释,我知道下面的查询具有与Q1不同的出色性能

注意:如果从中选择1并退出,Q1性能将阻止查询完成dual@db2在视图中,未注释。为了得到之前的执行计划,我必须改变会话,运行Q1,在大约4分钟后停止Q1,然后计算计划

以下执行计划是以相同的方式生成的,但该视图的行和existsselect 1来自dual@db2他们的表演很好

Plan hash value: 2906430222                                                                                            

-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name                | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                     |      1 |        |      9 |00:00:00.01 |     223 |
|*  1 |  COUNT STOPKEY                        |                     |      1 |        |      9 |00:00:00.01 |     223 |
|   2 |   NESTED LOOPS                        |                     |      1 |      1 |      9 |00:00:00.01 |     223 |
|   3 |    PARTITION LIST ALL                 |                     |      1 |      1 |      9 |00:00:00.01 |      41 |
|   4 |     PARTITION RANGE ALL               |                     |      1 |      1 |      9 |00:00:00.01 |      41 |
|   5 |      TABLE ACCESS BY LOCAL INDEX ROWID| ORDERS              |     14 |      1 |      9 |00:00:00.01 |      41 |
|*  6 |       INDEX RANGE SCAN                | IDX_CREATED         |     12 |      1 |      9 |00:00:00.01 |      33 |
|   7 |    VIEW PUSHED PREDICATE              | TEST                |      9 |      1 |      9 |00:00:00.01 |     182 |
|*  8 |     FILTER                            |                     |      9 |        |      9 |00:00:00.01 |     182 |
|   9 |      SORT AGGREGATE                   |                     |      9 |      1 |      9 |00:00:00.01 |     182 |
|  10 |       NESTED LOOPS                    |                     |      9 |    259 |   2376 |00:00:00.01 |     182 |
|* 11 |        INDEX UNIQUE SCAN              | PK_ID               |      9 |      1 |      9 |00:00:00.01 |      20 |
|* 12 |        INDEX STORAGE FAST FULL SCAN   | IDX_MN_AN_AD_ALL    |      9 |    259 |   2376 |00:00:00.01 |     162 |
-----------------------------------------------------------------------------------------------------------------------

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

   1 - filter(ROWNUM<10)                                                                                               
   6 - access("A_OUT"."CREATED">TRUNC(SYSDATE@!))                                                               
   8 - filter(COUNT(*)>0)                                                                                              
  11 - access("ID"="A_OUT"."ID")                                                                                 
  12 - storage(("B2"."ATTR_1"=NVL(CASE  WHEN SUBSTR("ID",(-1))<'5' THEN 'YYY' END ,'#') OR                          
              "B2"."ATTR_1"='*'))                                                                                      
       filter(("B2"."ATTR_1"=NVL(CASE  WHEN SUBSTR("ID",(-1))<'5' THEN 'YYY' END ,'#') OR                           
              "B2"."ATTR_1"='*'))       

从dual中选择1始终存在,此子查询没有意义->条件并存在从中选择1dual@db2总是评估为真,因此,只需从查询中删除此条件,就可以解决此问题。@krokodilko:view测试只是一个简单的示例,旨在说明我在几行代码中遇到的问题。真实视图要复杂得多,执行计划为500多行。并退出从中选择1dual@db2用于显示即使在使用如此简单的条件时问题也会发生。出于一些好的原因,我正在使用的真实视图访问DB2;然后运行查询,然后立即运行此查询:从表dbms\u xplan.display\u cursor format=>ALLSTATS LAST'中选择*;并将上次查询的结果附加到问题。这将生成查询的真实统计信息,而不是简单解释计划生成的估计统计信息。@krokodilko:我应用了建议的过程并编辑了问题,添加了Q1的执行计划以及行和existsselect 1 fromdual@db2在未注释的视图中,对于Q1,视图中的行已注释。谢谢时间=00:00:00.01,也就是100毫秒。在我看来,100毫秒不是性能问题。A-Rows=2376,这意味着该查询只扫描约2000行,这对于DBMS来说是非常少的。是否确实要优化此查询?我猜您正在尝试优化一个完全不同的查询,如果是,那么发布您想要优化的查询计划。您无法通过查看兰博基尼的性能图来调整法拉利。从dual中选择1始终存在,此子查询没有意义->条件和存在从中选择1dual@db2总是评估为真,因此,只需从查询中删除此条件,就可以解决此问题。@krokodilko:view测试只是一个简单的示例,旨在说明我在几行代码中遇到的问题。真实视图要复杂得多,执行计划为500多行。并退出从中选择1dual@db2用于显示即使在使用如此简单的条件时问题也会发生。出于一些好的原因,我正在使用的真实视图访问DB2;然后运行查询,然后立即运行此查询:从表dbms\u xplan.display\u cursor format=>ALLSTATS LAST'中选择*;并将上次查询的结果附加到问题。这将生成查询的真实统计信息,而不是简单解释计划生成的估计统计信息。@krokodilko:我应用了建议的过程并编辑了问题,添加了Q1的执行计划以及行和existsselect 1 fromdual@db2在未注释的视图中,对于Q1,视图中的行已注释。谢谢时间=00:00:00.01,也就是100毫秒。在我看来,100毫秒不是性能问题。A-Rows=2376,这意味着该查询只扫描约2000行,这对于DBMS来说是非常少的。是否确实要优化此查询?我猜您正在尝试优化一个完全不同的查询,如果是,那么发布您想要优化的查询计划。你不能通过兰博基尼的性能图来调整法拉利。
Plan hash value: 2906430222                                                                                                  

-----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name                | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                     |     1 |   274 |    64   (0)| 00:00:01 |       |       |
|*  1 |  COUNT STOPKEY                        |                     |       |       |            |          |       |       |
|   2 |   NESTED LOOPS                        |                     |     1 |   274 |    64   (0)| 00:00:01 |       |       |
|   3 |    PARTITION LIST ALL                 |                     |     1 |    22 |    59   (0)| 00:00:01 |     1 |     2 |
|   4 |     PARTITION RANGE ALL               |                     |     1 |    22 |    59   (0)| 00:00:01 |     1 |  LAST |
|   5 |      TABLE ACCESS BY LOCAL INDEX ROWID| ORDERS              |     1 |    22 |    59   (0)| 00:00:01 |     1 |    29 |
|*  6 |       INDEX RANGE SCAN                | IDX_ORDERS_CREATED  |     1 |       |    57   (0)| 00:00:01 |     1 |    29 |
|   7 |    VIEW PUSHED PREDICATE              | TEST                |     1 |   252 |     5   (0)| 00:00:01 |       |       |
|*  8 |     FILTER                            |                     |       |       |            |          |       |       |
|   9 |      SORT AGGREGATE                   |                     |     1 |    55 |            |          |       |       |
|  10 |       NESTED LOOPS                    |                     |   259 | 14245 |     5   (0)| 00:00:01 |       |       |
|* 11 |        INDEX UNIQUE SCAN              | PK_ID               |     1 |    14 |     2   (0)| 00:00:01 |       |       |
|* 12 |        INDEX STORAGE FAST FULL SCAN   | IDX_MN_AN_AD_ALL    |   259 | 10619 |     3   (0)| 00:00:01 |       |       |
-----------------------------------------------------------------------------------------------------------------------------

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

   1 - filter(ROWNUM<10)                                                                                                     
   6 - access("A_OUT"."CREATED">TRUNC(SYSDATE@!))                                                                     
   8 - filter(COUNT(*)>0)                                                                                                    
  11 - access("ID"="A_OUT"."ID")                                                                                       
  12 - storage("B2"."ATTR_1"=NVL(CASE  WHEN SUBSTR("ID",(-1))<'5' THEN 'YYY' END ,'#') OR "B2"."ATTR_1"='*')              
       filter("B2"."ATTR_1"=NVL(CASE  WHEN SUBSTR("ID",(-1))<'5' THEN 'YYY' END ,'#') OR "B2"."ATTR_1"='*')               
Plan hash value: 3271081243                                                                                                                   

----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                              | Name                | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop | Inst   |IN-OUT|
----------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                     |     1 |   288 |  5273K  (1)| 00:03:27 |       |       |        |      |
|*  1 |  COUNT STOPKEY                         |                     |       |       |            |          |       |       |        |      |
|*  2 |   HASH JOIN                            |                     |     1 |   288 |  5273K  (1)| 00:03:27 |       |       |        |      |
|   3 |    JOIN FILTER CREATE                  | :BF0000             |     1 |    22 |    59   (0)| 00:00:01 |       |       |        |      |
|   4 |     PARTITION LIST ALL                 |                     |     1 |    22 |    59   (0)| 00:00:01 |     1 |     2 |        |      |
|   5 |      PARTITION RANGE ALL               |                     |     1 |    22 |    59   (0)| 00:00:01 |     1 |  LAST |        |      |
|   6 |       TABLE ACCESS BY LOCAL INDEX ROWID| ORDERS              |     1 |    22 |    59   (0)| 00:00:01 |     1 |    29 |        |      |
|*  7 |        INDEX RANGE SCAN                | IDX_ORDERS_CREATED  |     1 |       |    57   (0)| 00:00:01 |     1 |    29 |        |      |
|   8 |    VIEW                                | TEST                |  3840K|   974M|  5273K  (1)| 00:03:27 |       |       |        |      |
|   9 |     SORT GROUP BY                      |                     |  3840K|   201M|  5273K  (1)| 00:03:27 |       |       |        |      |
|  10 |      JOIN FILTER USE                   | :BF0000             |   994M|    50G|  5273K  (1)| 00:03:27 |       |       |        |      |
|  11 |       NESTED LOOPS                     |                     |   994M|    50G|  5273K  (1)| 00:03:27 |       |       |        |      |
|  12 |        INDEX FULL SCAN                 | PK_ID               |  3840K|    51M| 66212   (1)| 00:00:03 |       |       |        |      |
|* 13 |        INDEX STORAGE FAST FULL SCAN    | IDX_MN_AN_AD_ALL    |   259 | 10619 |     1   (0)| 00:00:01 |       |       |        |      |
|  14 |         REMOTE                         |                     |       |       |            |          |       |       |    DB2 | R->S |
----------------------------------------------------------------------------------------------------------------------------------------------

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

   1 - filter(ROWNUM<10)                                                                                                                      
   2 - access("A_OUT"."ID"="Z_OUT"."ID")                                                                                                
   7 - access("A_OUT"."CREATED">TRUNC(SYSDATE@!))                                                                                      
  13 - filter("B2"."ATTR_1"=NVL(CASE  WHEN (SUBSTR("ID",(-1))<'5' AND  EXISTS (SELECT 0 FROM  "A1")) THEN 'YYY' END ,'#') OR               
              "B2"."ATTR_1"='*')                                                                                                              

Remote SQL Information (identified by operation id):                                                                                          
----------------------------------------------------                                                                                          

  14 - EXPLAIN PLAN INTO PLAN_TABLE@! FOR SELECT 0 FROM "DUAL" "A1" (accessing 'DB2' )                                                        
select
    (select value from test z_out where a_out.id=z_out.id) as value,
    a_out.id
from orders a_out
where a_out.created>trunc(sysdate) and rownum<10
alter session set statistics_level = 'ALL';
-- Q1 (the query I'm having problems with)
select * from table (dbms_xplan.display_cursor (format=>'ALLSTATS LAST'));

Plan hash value: 3271081243                                                                                                                                 

------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                              | Name                | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                     |      1 |        |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|*  1 |  COUNT STOPKEY                         |                     |      1 |        |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|*  2 |   HASH JOIN                            |                     |      1 |      1 |      0 |00:00:00.01 |       0 |      0 |  3789K|  3789K| 1078K (0)|
|   3 |    JOIN FILTER CREATE                  | :BF0000             |      1 |      1 |  25602 |00:00:00.22 |   23345 |    161 |       |       |          |
|   4 |     PARTITION LIST ALL                 |                     |      1 |      1 |  25602 |00:00:00.21 |   23345 |    161 |       |       |          |
|   5 |      PARTITION RANGE ALL               |                     |      2 |      1 |  25602 |00:00:00.21 |   23345 |    161 |       |       |          |
|   6 |       TABLE ACCESS BY LOCAL INDEX ROWID| ORDERS              |     29 |      1 |  25602 |00:00:00.20 |   23345 |    161 |       |       |          |
|*  7 |        INDEX RANGE SCAN                | IDX_CREATED         |     13 |      1 |  25602 |00:00:00.12 |     474 |    161 |  1025K|  1025K|          |
|   8 |    VIEW                                | TEST                |      1 |   3820K|      0 |00:00:00.01 |       0 |      0 |       |       |          |
|   9 |     SORT GROUP BY                      |                     |      1 |   3820K|      0 |00:00:00.01 |       0 |      0 | 73728 | 73728 |          |
|  10 |      JOIN FILTER USE                   | :BF0000             |      1 |    989M|    106M|00:03:38.87 |      60M|  52960 |       |       |          |
|  11 |       NESTED LOOPS                     |                     |      1 |    989M|    328M|00:03:04.11 |      60M|  52960 |       |       |          |
|  12 |        INDEX FULL SCAN                 | PK_ID               |      1 |   3820K|   1245K|00:00:21.04 |     200K|  52959 |  1025K|  1025K|          |
|* 13 |        INDEX STORAGE FAST FULL SCAN    | IDX_MN_AN_AD_ALL    |   1245K|    259 |    328M|00:02:12.09 |      60M|      1 |  1025K|  1025K|          |
|  14 |         REMOTE                         |                     |      1 |        |      1 |00:00:00.01 |       0 |      0 |       |       |          |
------------------------------------------------------------------------------------------------------------------------------------------------------------

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

   1 - filter(ROWNUM<10)                                                                                                                                    
   2 - access("A_OUT"."ID"="Z_OUT"."ID")                                                                                                              
   7 - access("A_OUT"."CREATED">TRUNC(SYSDATE@!))                                                                                                    
  13 - filter(("B2"."ATTR_1"=NVL(CASE  WHEN (SUBSTR("ID",(-1))<'5' AND  IS NOT NULL) THEN 'YYY' END ,'#') OR "B2"."ATTR_1"='*'))                         
Plan hash value: 2906430222                                                                                            

-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name                | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |                     |      1 |        |      9 |00:00:00.01 |     223 |
|*  1 |  COUNT STOPKEY                        |                     |      1 |        |      9 |00:00:00.01 |     223 |
|   2 |   NESTED LOOPS                        |                     |      1 |      1 |      9 |00:00:00.01 |     223 |
|   3 |    PARTITION LIST ALL                 |                     |      1 |      1 |      9 |00:00:00.01 |      41 |
|   4 |     PARTITION RANGE ALL               |                     |      1 |      1 |      9 |00:00:00.01 |      41 |
|   5 |      TABLE ACCESS BY LOCAL INDEX ROWID| ORDERS              |     14 |      1 |      9 |00:00:00.01 |      41 |
|*  6 |       INDEX RANGE SCAN                | IDX_CREATED         |     12 |      1 |      9 |00:00:00.01 |      33 |
|   7 |    VIEW PUSHED PREDICATE              | TEST                |      9 |      1 |      9 |00:00:00.01 |     182 |
|*  8 |     FILTER                            |                     |      9 |        |      9 |00:00:00.01 |     182 |
|   9 |      SORT AGGREGATE                   |                     |      9 |      1 |      9 |00:00:00.01 |     182 |
|  10 |       NESTED LOOPS                    |                     |      9 |    259 |   2376 |00:00:00.01 |     182 |
|* 11 |        INDEX UNIQUE SCAN              | PK_ID               |      9 |      1 |      9 |00:00:00.01 |      20 |
|* 12 |        INDEX STORAGE FAST FULL SCAN   | IDX_MN_AN_AD_ALL    |      9 |    259 |   2376 |00:00:00.01 |     162 |
-----------------------------------------------------------------------------------------------------------------------

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

   1 - filter(ROWNUM<10)                                                                                               
   6 - access("A_OUT"."CREATED">TRUNC(SYSDATE@!))                                                               
   8 - filter(COUNT(*)>0)                                                                                              
  11 - access("ID"="A_OUT"."ID")                                                                                 
  12 - storage(("B2"."ATTR_1"=NVL(CASE  WHEN SUBSTR("ID",(-1))<'5' THEN 'YYY' END ,'#') OR                          
              "B2"."ATTR_1"='*'))                                                                                      
       filter(("B2"."ATTR_1"=NVL(CASE  WHEN SUBSTR("ID",(-1))<'5' THEN 'YYY' END ,'#') OR                           
              "B2"."ATTR_1"='*'))