相同语句,时间段不一样,不同执行计划分析心得

来源:互联网 发布:list数据排序 编辑:程序博客网 时间:2024/05/22 12:19


           已知NT_AS_SERVICE_ORDERS是主表,TMP1是主表。它们之间连接通过字段DEALER_ID、SO_NO进行关联。在从表中是通过 时间进行过滤的,而主表中就没有过滤条件。

案例一:

SELECT  *
  FROM (SELECT  DISTINCT A.DEALER_ID,
                        A.CO_NO,
                        A.RU_UPLOADED_DATE,
                        A.CLAIM_CATEGORY,
                        A.CO_STATUS,
                        A.INQUIRY_RESULT,
                        C.VIN,
                        C.PLATE_NO,
                        C.OWNER_NAME,
                        C.COMING_TIME,
                        D.DEALER_SHORT_NAME AS DEALER_NAME,
                        D.DEALER_CODE,
                        D.SV_CENTER_ID,
                        D.PROVINCE,
                        T3.OPINIONS_DLR,
                        T3.HANDLED_DATE_DLR,
                        T3.HANDLER_DLR,
                        A.CLAIMING_TYPE,
                        A.CI_HANDLE_RESULT
          FROM TMP1 A
          JOIN NT_AS_SERVICE_ORDERS C
            ON A.DEALER_ID = C.DEALER_ID
           AND A.SO_NO = C.SO_NO
          JOIN NT_BB_SERVICE_STATIONS D
            ON A.DEALER_ID = D.DEALER_ID
          LEFT JOIN (SELECT DEALER_ID,
                           CO_NO,
                           INQUIRED_DATE,
                           OPINIONS_DLR,
                           HANDLED_DATE_DLR,
                           HANDLER_DLR,
                           ROW_NUMBER() OVER(PARTITION BY DEALER_ID, CO_NO ORDER BY
                           
                           INQUIRED_DATE DESC) AS VALUE1
                      FROM NT_CI_CLAIMING_INQUIRIES) T3
            ON A.DEALER_ID = T3.DEALER_ID
           AND A.CO_NO = T3.CO_NO
           AND T3.VALUE1 = 1
         WHERE (A.COMPANY_ID = 1002 OR A.COMPANY_ID = 0)
           AND A.IS_INACTIVE = 0
           AND A.RU_UPLOADED_DATE >= to_date('2013-07-01', 'yyyy-mm-dd')
           AND A.RU_UPLOADED_DATE <= to_date('2013-07-02', 'yyyy-mm-dd')
         ORDER BY C.COMING_TIME, C.VIN DESC)

 WHERE ROWNUM <= 5000


执行计划:

         Plan hash value: 53527625
 
----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                 | Name                     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                          |                          |   966 |  2218K|       |  7802  (13)| 00:01:50 |       |       |
|*  1 |  COUNT STOPKEY                            |                          |       |       |       |            |          |       |       |
|   2 |   VIEW                                    |                          |   966 |  2218K|       |  7802  (13)| 00:01:50 |       |       |
|*  3 |    SORT UNIQUE STOPKEY                    |                          |   966 |  1228K|  1312K|  7633  (13)| 00:01:47 |       |       |
|   4 |     NESTED LOOPS                          |                          |       |       |       |            |          |       |       |
|   5 |      NESTED LOOPS                         |                          |   966 |  1228K|       |  7464  (13)| 00:01:45 |       |       |
|*  6 |       HASH JOIN                           |                          |   966 |  1161K|       |  5531  (18)| 00:01:18 |       |       |
|   7 |        TABLE ACCESS FULL                  | NT_BB_SERVICE_STATIONS   |  1690 | 55770 |       |    73   (0)| 00:00:02 |       |       |
|   8 |        NESTED LOOPS OUTER                 |                          |   966 |  1130K|       |  5457  (18)| 00:01:17 |       |       |
|   9 |         PARTITION RANGE SINGLE            |                          |   966 | 73416 |       |   625   (0)| 00:00:09 |     8 |     8 |
|* 10 |          TABLE ACCESS BY LOCAL INDEX ROWID| TMP1                     |   966 | 73416 |       |   625   (0)| 00:00:09 |     8 |     8 |
|* 11 |           INDEX RANGE SCAN                | IDX_TMP1                 |   966 |       |       |     3   (0)| 00:00:01 |     8 |     8 |
|* 12 |         VIEW PUSHED PREDICATE             |                          |     1 |  1122 |       |     5  (20)| 00:00:01 |       |       |
|* 13 |          WINDOW SORT PUSHED RANK          |                          |     1 |    45 |       |     5  (20)| 00:00:01 |       |       |
|  14 |           TABLE ACCESS BY INDEX ROWID     | NT_CI_CLAIMING_INQUIRIES |     1 |    45 |       |     4   (0)| 00:00:01 |       |       |
|* 15 |            INDEX RANGE SCAN               | IF_FK_CI_CO_INQUIRIES    |     1 |       |       |     3   (0)| 00:00:01 |       |       |
|* 16 |       INDEX UNIQUE SCAN                   | PK_NT_AS_SERVICE_ORDERS  |     1 |       |       |     1   (0)| 00:00:01 |       |       |
|  17 |      TABLE ACCESS BY INDEX ROWID          | NT_AS_SERVICE_ORDERS     |     1 |    71 |       |     2   (0)| 00:00:01 |       |       |
----------------------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter(ROWNUM<=5000)
   3 - filter(ROWNUM<=5000)
   6 - access("A"."DEALER_ID"="D"."DEALER_ID")
  10 - filter("A"."IS_INACTIVE"=0 AND ("A"."COMPANY_ID"=0 OR "A"."COMPANY_ID"=1002))
  11 - access("A"."RU_UPLOADED_DATE">=TIMESTAMP' 2013-07-01 00:00:00' AND "A"."RU_UPLOADED_DATE"<=TIMESTAMP' 2013-07-02 00:00:00')
  12 - filter("T3"."VALUE1"(+)=1)
  13 - filter(ROW_NUMBER() OVER ( PARTITION BY "DEALER_ID","CO_NO" ORDER BY INTERNAL_FUNCTION("INQUIRED_DATE") DESC )<=1)
  15 - access("CO_NO"="A"."CO_NO" AND "DEALER_ID"="A"."DEALER_ID")
  16 - access("A"."SO_NO"="C"."SO_NO" AND "A"."DEALER_ID"="C"."DEALER_ID")


注:此时通过NESTED LOOPS方式进行关联。


案例二:


SELECT  *
  FROM (SELECT  DISTINCT A.DEALER_ID,
                        A.CO_NO,
                        A.RU_UPLOADED_DATE,
                        A.CLAIM_CATEGORY,
                        A.CO_STATUS,
                        A.INQUIRY_RESULT,
                        C.VIN,
                        C.PLATE_NO,
                        C.OWNER_NAME,
                        C.COMING_TIME,
                        D.DEALER_SHORT_NAME AS DEALER_NAME,
                        D.DEALER_CODE,
                        D.SV_CENTER_ID,
                        D.PROVINCE,
                        T3.OPINIONS_DLR,
                        T3.HANDLED_DATE_DLR,
                        T3.HANDLER_DLR,
                        A.CLAIMING_TYPE,
                        A.CI_HANDLE_RESULT
          FROM TMP1 A
          JOIN NT_AS_SERVICE_ORDERS C
            ON A.DEALER_ID = C.DEALER_ID
           AND A.SO_NO = C.SO_NO
          JOIN NT_BB_SERVICE_STATIONS D
            ON A.DEALER_ID = D.DEALER_ID
          LEFT JOIN (SELECT DEALER_ID,
                           CO_NO,
                           INQUIRED_DATE,
                           OPINIONS_DLR,
                           HANDLED_DATE_DLR,
                           HANDLER_DLR,
                           ROW_NUMBER() OVER(PARTITION BY DEALER_ID, CO_NO ORDER BY
                           
                           INQUIRED_DATE DESC) AS VALUE1
                      FROM NT_CI_CLAIMING_INQUIRIES) T3
            ON A.DEALER_ID = T3.DEALER_ID
           AND A.CO_NO = T3.CO_NO
           AND T3.VALUE1 = 1
         WHERE (A.COMPANY_ID = 1002 OR A.COMPANY_ID = 0)
           AND A.IS_INACTIVE = 0
           AND A.RU_UPLOADED_DATE >= to_date('2013-07-01', 'yyyy-mm-dd')
           AND A.RU_UPLOADED_DATE <= to_date('2013-10-18', 'yyyy-mm-dd')
         ORDER BY C.COMING_TIME, C.VIN DESC)
 WHERE ROWNUM <= 5000


执行计划:


 Plan hash value: 2332382148
 
-----------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                          |  5000 |    11M|       |   211K  (1)| 00:49:28 |       |       |
|*  1 |  COUNT STOPKEY                 |                          |       |       |       |            |          |       |       |
|   2 |   VIEW                         |                          |   315K|   707M|       |   211K  (1)| 00:49:28 |       |       |
|*  3 |    SORT UNIQUE STOPKEY         |                          |   315K|    74M|    79M|   201K  (1)| 00:47:01 |       |       |
|*  4 |     HASH JOIN                  |                          |   315K|    74M|       |   191K  (1)| 00:44:35 |       |       |
|   5 |      TABLE ACCESS FULL         | NT_BB_SERVICE_STATIONS   |  1690 | 55770 |       |    73   (0)| 00:00:02 |       |       |
|*  6 |      HASH JOIN OUTER           |                          |   315K|    64M|    42M|   190K  (1)| 00:44:34 |       |       |
|*  7 |       HASH JOIN                |                          |   252K|    39M|    25M|   177K  (1)| 00:41:27 |       |       |
|   8 |        PARTITION RANGE ITERATOR|                          |   252K|    22M|       |  2427   (1)| 00:00:34 |     8 |     9 |
|*  9 |         TABLE ACCESS FULL      | TMP1                     |   252K|    22M|       |  2427   (1)| 00:00:34 |     8 |     9 |
|  10 |        TABLE ACCESS FULL       | NT_AS_SERVICE_ORDERS     |    11M|   757M|       |   136K  (1)| 00:31:47 |       |       |
|* 11 |       VIEW                     |                          |   921K|    41M|       |  9264   (1)| 00:02:10 |       |       |
|* 12 |        WINDOW SORT PUSHED RANK |                          |   921K|    39M|    56M|  9264   (1)| 00:02:10 |       |       |
|  13 |         TABLE ACCESS FULL      | NT_CI_CLAIMING_INQUIRIES |   921K|    39M|       |  2690   (2)| 00:00:38 |       |       |
-----------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter(ROWNUM<=5000)
   3 - filter(ROWNUM<=5000)
   4 - access("A"."DEALER_ID"="D"."DEALER_ID")
   6 - access("A"."CO_NO"="T3"."CO_NO"(+) AND "A"."DEALER_ID"="T3"."DEALER_ID"(+))
   7 - access("A"."DEALER_ID"="C"."DEALER_ID" AND "A"."SO_NO"="C"."SO_NO")
   9 - filter("A"."IS_INACTIVE"=0 AND ("A"."COMPANY_ID"=0 OR "A"."COMPANY_ID"=1002) AND "A"."RU_UPLOADED_DATE"<=TIMESTAMP' 
              2013-10-18 00:00:00')
  11 - filter("T3"."VALUE1"(+)=1)
  12 - filter(ROW_NUMBER() OVER ( PARTITION BY "DEALER_ID","CO_NO" ORDER BY INTERNAL_FUNCTION("INQUIRED_DATE") DESC )<=1)


注:通过hash join进行两个表间的关联。



总结以下几个结论:


             1 主从表的连接方式,是这样的,先过滤掉从表的数据,能过滤的越多就越好。

             2 主从表连接方式都是通过外键进行

             3 如果从表过滤的数据很多,如果从表查出的记录为1条,它的性能是最优,通过NESTED LOOPS方式,这样与主表通过外键连接,效率是最高的

             4 如果从表过滤的数据并不是很多,如果从表查出的记录为很多很多,这种情况下,优化器默认会选择hash join的方式,这种情况下就会对主表进行全表扫描,考虑这种方案的优化,尽量在主表中加个过滤条件,从而能提升性能










原创粉丝点击