【问题标题】:IN clause causing high execution timeIN 子句导致高执行时间
【发布时间】:2017-07-13 23:47:55
【问题描述】:

我有一个类似这样的 118 行查询:

select * from (The inner query with many joins) WHERE campus_code IN ('560','598')

campus_code 由内部查询中的函数f_get_bookstore(SSBSECT_TERM_CODE,SSBSECT_CRN) AS SSBSECT_CAMP_CODE 生成。如果我单独运行内部查询,它的计数是 18 并且它会在 13 秒内执行。但如果我添加 WHERE campus_code IN ('560','598') 则需要超过 2 分钟。

另一个奇怪的事情是,我有另一个查询,也像

select * from (The inner query with many joins) WHERE campus_code IN ('560','598')。这里的内部查询与前一个略有不同。内部查询很快并返回 92 行。但是这里 campus_code IN 过滤速度很快,即使它处理 92 行(与前一个查询的 18 行不同)。这里的 Campus_code 也是通过相同的函数生成的。

任何机构都可以帮助调整查询吗?请告诉您还需要什么信息。

这是整个查询:

    SELECT *
FROM
  (SELECT 'columbusstate' bk_institution_id,
    'columbusstate.'
    || scbcrse_subj_code
    || '.'
    || scbcrse_crse_numb
    ||'.'
    || Ssbsect_Crn
    || '.'
    || ssbsect_term_code bk_section_id,
    ssbsect_camp_code AS campus_code,
    scbcrse_subj_code
    || '.'
    || scbcrse_crse_numb
    ||'.'
    || Ssbsect_Crn
    || '.'
    || ssbsect_term_code institution_section_id,
    ssbsect_crn short_description,
    scbcrse_title AS description,
    ssbsect_crn sections_ssbsect_crn,
    ssbsect_term_code sections_ssbsect_term_code,
    'na' instructor_first_name,
    'na' instructor_last_name,
    scbcrse_subj_code
    || '.'
    || scbcrse_crse_numb rel_institution_course_id,
    scbcrse_title     AS rel_course_description,
    scbcrse_title     AS rel_course_name,
    scbcrse_crse_numb AS course_short_desc,
    scbcrse_crse_numb course_number,
    stvterm_desc term_short_desc,
    stvterm_code rel_institution_term_id,
    section.ssbsect_crn,
    ssbsect_ssts_code AS ssbsect_ssts_code,
    'columbusstate.'
    || stvterm_code rel_bk_term_id,
    'columbusstate.'
    || scbcrse_subj_code
    || '.'
    || scbcrse_crse_numb rel_bk_course_id,
    ssbsect_seq_numb,
    ssbsect_enrl ssbsect_enrl,
    ssbsect_enrl estimated_enrl,
    ssbsect_max_enrl ssbsect_max_enrl,
    ssbsect_crn ssbsect_section_key,
    ssbsect_crn ssbsect_section_number,
    'parent' relationship,
    course.scbcrse_subj_code institution_department_id ,
    'DFLT' institution_division_id,
    'DFLT' division_short_desc
  FROM
    (SELECT *
    FROM
      (SELECT SSBSECT_TERM_CODE,
        SSBSECT_CRN,
        SSBSECT_SUBJ_CODE,
        SSBSECT_CRSE_NUMB,
        SSBSECT_PTRM_CODE,        
        SSBSECT_SEQ_NUMB,
        SSBSECT_SSTS_CODE,
        SSBSECT_MAX_ENRL,
        SSBSECT_ENRL,
        SSBSECT_PRNT_IND,
        f_get_bookstore(SSBSECT_TERM_CODE,SSBSECT_CRN) AS SSBSECT_CAMP_CODE
      FROM SSBSECT
      ) sect
    JOIN
      (SELECT *
      FROM
        (SELECT * FROM saturn.stvterm WHERE STVTERM_CODE >= '201401' 
        )
      ) term
    ON term.stvterm_code=sect.ssbsect_term_code
    ) section
  JOIN
    (SELECT C1.scbcrse_subj_code,
      C1.scbcrse_dept_code,
      C1.scbcrse_crse_numb,
      C1.scbcrse_title
    FROM saturn.scbcrse C1          
    LEFT JOIN saturn.scbcrse C2
    ON (C1.scbcrse_subj_code             = C2.scbcrse_subj_code       
    AND C1.scbcrse_crse_numb             = C2.scbcrse_crse_numb
    AND C1.scbcrse_eff_term              < C2.scbcrse_eff_term)
    WHERE c2.scbcrse_eff_term           IS NULL
    ) Course ON Course.scbcrse_subj_code = Section.ssbsect_subj_code
  AND scbcrse_crse_numb                  = section.ssbsect_crse_numb
  AND ssbsect_ssts_code                 IN ('A','V','X')
  LEFT JOIN
    (SELECT sirasgn_term_code sirasgn_term_code,
      sirasgn_crn,
      MAX(spriden_pidm) spriden_pidm,
      MAX(spriden_first_name) instructor_first_name,
      MAX(spriden_last_name) instructor_last_name
    FROM
      (SELECT Pidm spriden_pidm,
        Csu_Id SPRIDEN_ID,
        First_Name spriden_first_name,
        Last_Name spriden_last_name,        
        Mi spriden_mi,
        External_User_Id login,
        Email
      FROM Csuapps.Wfollett_Person
      ) persons
    JOIN
      ( SELECT * FROM saturn.sirasgn WHERE SIRASGN_PRIMARY_IND = 'Y'
      ) relations
    ON persons.spriden_pidm=relations.sirasgn_pidm
    GROUP BY sirasgn_crn,
      sirasgn_term_code
    ) instr ON section.ssbsect_term_code=instr.sirasgn_term_code
  AND section.ssbsect_crn               =instr.sirasgn_crn
  WHERE Course.scbcrse_subj_code        = 'ACCT'
  AND section.ssbsect_term_code         = '201702'
  )
WHERE campus_code IN ('560','1157')

执行计划:

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2063389120

-----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                      | Name               | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                               |                    |    77 |   968K|       |  4364   (3)| 00:00:01 |
|   1 |  SORT ORDER BY                                 |                    |    77 |   968K|   624K|  4364   (3)| 00:00:01 |
|*  2 |   VIEW                                         |                    |    77 |   968K|       |  4155   (3)| 00:00:01 |
|   3 |    COUNT                                       |                    |       |       |       |            |          |
|   4 |     VIEW                                       |                    |    77 |   967K|       |  4155   (3)| 00:00:01 |
|   5 |      SORT ORDER BY                             |                    |    77 |   774K|       |  4155   (3)| 00:00:01 |

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|*  6 |       FILTER                                   |                    |       |       |       |            |          |
|*  7 |        HASH JOIN RIGHT OUTER                   |                    |    77 |   774K|       |  4154   (3)| 00:00:01 |
|*  8 |         INDEX RANGE SCAN                       | SCBCRSE_KEY_INDEX  |    83 |  1494 |       |     1   (0)| 00:00:01 |
|   9 |         NESTED LOOPS                           |                    |    77 |   772K|       |  4153   (3)| 00:00:01 |
|  10 |          NESTED LOOPS OUTER                    |                    |    23 |   229K|       |  4139   (3)| 00:00:01 |
|* 11 |           HASH JOIN OUTER                      |                    |    23 |  1656 |       |  3783   (1)| 00:00:01 |
|  12 |            NESTED LOOPS                        |                    |    23 |  1334 |       |     7   (0)| 00:00:01 |
|  13 |             TABLE ACCESS BY INDEX ROWID        | STVTERM            |     1 |    22 |       |     1   (0)| 00:00:01 |
|* 14 |              INDEX UNIQUE SCAN                 | PK_STVTERM         |     1 |       |       |     1   (0)| 00:00:01 |
|* 15 |             TABLE ACCESS BY INDEX ROWID BATCHED| SSBSECT            |    23 |   828 |       |     6   (0)| 00:00:01 |
|* 16 |              INDEX RANGE SCAN                  | SSBSECT_INDEX_SUBJ |    25 |       |       |     1   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|  17 |            VIEW                                |                    |  2172 | 30408 |       |  3775   (1)| 00:00:01 |
|  18 |             HASH GROUP BY                      |                    |  2172 |  8537K|    16M|  3775   (1)| 00:00:01 |
|* 19 |              HASH JOIN                         |                    |  4166 |    15M|       |  1364   (1)| 00:00:01 |
|  20 |               VIEW                             | VW_GBF_14          |  2312 | 18496 |       |   211   (1)| 00:00:01 |
|  21 |                HASH GROUP BY                   |                    |  2312 | 48552 |       |   211   (1)| 00:00:01 |
|* 22 |                 TABLE ACCESS FULL              | SIRASGN            |  2312 | 48552 |       |   210   (1)| 00:00:01 |
|  23 |               VIEW                             | WFOLLETT_PERSON    |  3714 |    14M|       |  1153   (1)| 00:00:01 |
|  24 |                SORT UNIQUE                     |                    |  3714 |   342K|       |  1153   (1)| 00:00:01 |
|  25 |                 UNION-ALL                      |                    |       |       |       |            |          |
|  26 |                  NESTED LOOPS                  |                    |     1 |    59 |       |     2   (0)| 00:00:01 |
|  27 |                   NESTED LOOPS                 |                    |     1 |    59 |       |     2   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|* 28 |                    INDEX RANGE SCAN            | PK_GLBEXTR         |     1 |    38 |       |     1   (0)| 00:00:01 |
|* 29 |                    INDEX UNIQUE SCAN           | PK_GOBTPAC         |     1 |       |       |     1   (0)| 00:00:01 |
|  30 |                   TABLE ACCESS BY INDEX ROWID  | GOBTPAC            |     1 |    21 |       |     1   (0)| 00:00:01 |
|  31 |                  NESTED LOOPS                  |                    |  1912 |   130K|       |   605   (0)| 00:00:01 |
|  32 |                   NESTED LOOPS                 |                    |  1912 |   130K|       |   605   (0)| 00:00:01 |
|* 33 |                    HASH JOIN                   |                    |  1912 | 93688 |       |    31   (0)| 00:00:01 |
|  34 |                     VIEW                       | VW_SQ_2            |  3076 | 83052 |       |    10   (0)| 00:00:01 |
|  35 |                      HASH GROUP BY             |                    |  3076 | 39988 |       |    10   (0)| 00:00:01 |
|  36 |                       INDEX FULL SCAN          | PK_SIBINST         |  6243 | 81159 |       |    10   (0)| 00:00:01 |
|* 37 |                     TABLE ACCESS FULL          | SIBINST            |  3881 | 85382 |       |    21   (0)| 00:00:01 |
|* 38 |                    INDEX UNIQUE SCAN           | PK_GOBTPAC         |     1 |       |       |     1   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|  39 |                   TABLE ACCESS BY INDEX ROWID  | GOBTPAC            |     1 |    21 |       |     1   (0)| 00:00:01 |
|  40 |                  NESTED LOOPS                  |                    |  1801 | 41423 |       |   543   (1)| 00:00:01 |
|  41 |                   NESTED LOOPS                 |                    |  1801 | 41423 |       |   543   (1)| 00:00:01 |
|  42 |                    VIEW                        | VW_DTP_6100A9C4    |  1801 |  3602 |       |     3  (34)| 00:00:01 |
|  43 |                     HASH UNIQUE                |                    |  1801 | 23413 |       |     3  (34)| 00:00:01 |
|* 44 |                      INDEX RANGE SCAN          | PK_SIRASGN         |  4161 | 54093 |       |     2   (0)| 00:00:01 |
|* 45 |                    INDEX UNIQUE SCAN           | PK_GOBTPAC         |     1 |       |       |     1   (0)| 00:00:01 |
|  46 |                   TABLE ACCESS BY INDEX ROWID  | GOBTPAC            |     1 |    21 |       |     1   (0)| 00:00:01 |
|  47 |           VIEW PUSHED PREDICATE                |                    |     1 | 10165 |       |    16  (25)| 00:00:01 |
|* 48 |            FILTER                              |                    |       |       |       |            |          |
|  49 |             NESTED LOOPS                       |                    |     1 | 10164 |       |    16  (25)| 00:00:01 |

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|  50 |              NESTED LOOPS                      |                    |     1 |    79 |       |     4   (0)| 00:00:01 |
|* 51 |               FILTER                           |                    |       |       |       |            |          |
|  52 |                NESTED LOOPS OUTER              |                    |     1 |    60 |       |     3   (0)| 00:00:01 |
|  53 |                 NESTED LOOPS                   |                    |     1 |    42 |       |     2   (0)| 00:00:01 |
|  54 |                  TABLE ACCESS BY INDEX ROWID   | SSBSECT            |     1 |    24 |       |     1   (0)| 00:00:01 |
|* 55 |                   INDEX UNIQUE SCAN            | PK_SSBSECT         |     1 |       |       |     1   (0)| 00:00:01 |
|* 56 |                  INDEX RANGE SCAN              | SCBCRSE_KEY_INDEX  |     1 |    18 |       |     1   (0)| 00:00:01 |
|* 57 |                 INDEX RANGE SCAN               | SCBCRSE_KEY_INDEX  | 15046 |   264K|       |     1   (0)| 00:00:01 |
|* 58 |               INDEX RANGE SCAN                 | PK_SIRASGN         |     1 |    19 |       |     1   (0)| 00:00:01 |
|  59 |              VIEW                              | WFOLLETT_PERSON    |     1 | 10085 |       |    12  (34)| 00:00:01 |
|  60 |               SORT UNIQUE                      |                    |     3 |   304 |       |    12  (34)| 00:00:01 |

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|  61 |                UNION ALL PUSHED PREDICATE      |                    |       |       |       |            |          |
|  62 |                 NESTED LOOPS                   |                    |     1 |    59 |       |     2   (0)| 00:00:01 |
|  63 |                  TABLE ACCESS BY INDEX ROWID   | GOBTPAC            |     1 |    21 |       |     1   (0)| 00:00:01 |
|* 64 |                   INDEX UNIQUE SCAN            | PK_GOBTPAC         |     1 |       |       |     1   (0)| 00:00:01 |
|* 65 |                  INDEX RANGE SCAN              | PK_GLBEXTR         |     1 |    38 |       |     1   (0)| 00:00:01 |
|  66 |                 NESTED LOOPS                   |                    |     1 |    70 |       |     3   (0)| 00:00:01 |
|  67 |                  NESTED LOOPS                  |                    |     1 |    70 |       |     3   (0)| 00:00:01 |
|  68 |                   NESTED LOOPS                 |                    |     1 |    48 |       |     2   (0)| 00:00:01 |
|  69 |                    TABLE ACCESS BY INDEX ROWID | GOBTPAC            |     1 |    21 |       |     1   (0)| 00:00:01 |
|* 70 |                     INDEX UNIQUE SCAN          | PK_GOBTPAC         |     1 |       |       |     1   (0)| 00:00:01 |
|  71 |                    VIEW                        | VW_SQ_1            |     1 |    27 |       |     1   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|  72 |                     SORT GROUP BY              |                    |     1 |    13 |       |     1   (0)| 00:00:01 |
|* 73 |                      INDEX RANGE SCAN          | PK_SIBINST         |     2 |    26 |       |     1   (0)| 00:00:01 |
|* 74 |                   INDEX UNIQUE SCAN            | PK_SIBINST         |     1 |       |       |     1   (0)| 00:00:01 |
|* 75 |                  TABLE ACCESS BY INDEX ROWID   | SIBINST            |     1 |    22 |       |     1   (0)| 00:00:01 |
|  76 |                 NESTED LOOPS                   |                    |     1 |    23 |       |     4  (25)| 00:00:01 |
|  77 |                  TABLE ACCESS BY INDEX ROWID   | GOBTPAC            |     1 |    21 |       |     1   (0)| 00:00:01 |
|* 78 |                   INDEX UNIQUE SCAN            | PK_GOBTPAC         |     1 |       |       |     1   (0)| 00:00:01 |
|* 79 |                  VIEW                          | VW_DTP_32C68FB6    |     1 |     2 |       |     3  (34)| 00:00:01 |
|  80 |                   SORT UNIQUE                  |                    |     2 |    26 |       |     3  (34)| 00:00:01 |
|* 81 |                    INDEX RANGE SCAN            | PK_SIRASGN         |     2 |    26 |       |     2   (0)| 00:00:01 |
|  82 |          TABLE ACCESS BY INDEX ROWID BATCHED   | SCBCRSE            |     3 |   126 |       |     1   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|* 83 |           INDEX RANGE SCAN                     | SCBCRSE_KEY_INDEX  |     1 |       |       |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------------------------

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

   2 - filter(("from$_subquery$_002"."CAMPUS_CODE"='1157' OR "from$_subquery$_002"."CAMPUS_CODE"='560') AND "R">=1 
              AND "R"<=1500)
   6 - filter("C2"."SCBCRSE_EFF_TERM" IS NULL)
   7 - access("C1"."SCBCRSE_SUBJ_CODE"="C2"."SCBCRSE_SUBJ_CODE"(+) AND 
              "C1"."SCBCRSE_CRSE_NUMB"="C2"."SCBCRSE_CRSE_NUMB"(+))

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       filter("C1"."SCBCRSE_EFF_TERM"<"C2"."SCBCRSE_EFF_TERM"(+))
   8 - access("C2"."SCBCRSE_SUBJ_CODE"(+)='ACCT')
  11 - access("SSBSECT_TERM_CODE"="INSTR"."SIRASGN_TERM_CODE"(+) AND "SSBSECT_CRN"="INSTR"."SIRASGN_CRN"(+))
  14 - access("STVTERM"."STVTERM_CODE"='201702')
  15 - filter("SSBSECT_SSTS_CODE"='A' OR "SSBSECT_SSTS_CODE"='V' OR "SSBSECT_SSTS_CODE"='X')
  16 - access("SSBSECT_SUBJ_CODE"='ACCT' AND "SSBSECT_TERM_CODE"='201702')
       filter("SSBSECT_TERM_CODE"='201702')
  19 - access("PIDM"="ITEM_1")
  22 - filter("SIRASGN"."SIRASGN_TERM_CODE"='201702' AND "SIRASGN_PRIMARY_IND"='Y')
  28 - access("GLBEXTR_APPLICATION"='STUDENT' AND "GLBEXTR_SELECTION"='CURR_ENRL' AND "GLBEXTR_CREATOR_ID"='GSHOUL')
  29 - access("GOBTPAC_PIDM"=TO_NUMBER("GLBEXTR_KEY"))

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  33 - access("A"."SIBINST_TERM_CODE_EFF"="MAX(B.SIBINST_TERM_CODE_EFF)" AND "ITEM_2"="A"."SIBINST_PIDM")
  37 - filter("A"."SIBINST_FCST_CODE"='AC' AND "A"."SIBINST_FCTG_CODE"<>'EMPL')
  38 - access("A"."SIBINST_PIDM"="GOBTPAC_PIDM")
  44 - access("SIRASGN_TERM_CODE">="TOOLS"."GETTERMCODE"(NULL,SYSDATE@!))
  45 - access("ITEM_1"="GOBTPAC_PIDM")
  48 - filter("SSBSECT_TERM_CODE">='201602' AND "SSBSECT_TERM_CODE"='201702')
  51 - filter("C2"."SCBCRSE_EFF_TERM" IS NULL)
  55 - access("SSBSECT_TERM_CODE"="SSBSECT_TERM_CODE" AND "SSBSECT_CRN"="SSBSECT_CRN")
       filter("SSBSECT_TERM_CODE"='201702')
  56 - access("SSBSECT_SUBJ_CODE"="C1"."SCBCRSE_SUBJ_CODE" AND "SSBSECT_CRSE_NUMB"="C1"."SCBCRSE_CRSE_NUMB")
  57 - access("C1"."SCBCRSE_SUBJ_CODE"="C2"."SCBCRSE_SUBJ_CODE"(+) AND 

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
              "C1"."SCBCRSE_CRSE_NUMB"="C2"."SCBCRSE_CRSE_NUMB"(+) AND "C1"."SCBCRSE_EFF_TERM"<"C2"."SCBCRSE_EFF_TERM"(+) AND 
              "C2"."SCBCRSE_EFF_TERM"(+) IS NOT NULL)
  58 - access("REL"."SIRASGN_TERM_CODE"="SSBSECT_TERM_CODE" AND "REL"."SIRASGN_CRN"="SSBSECT_CRN")
       filter("REL"."SIRASGN_TERM_CODE"="SSBSECT_TERM_CODE" AND "REL"."SIRASGN_TERM_CODE"='201702' AND 
              "REL"."SIRASGN_CRN"="SSBSECT_CRN")
  64 - access("GOBTPAC_PIDM"="REL"."SIRASGN_PIDM")
  65 - access("GLBEXTR_APPLICATION"='STUDENT' AND "GLBEXTR_SELECTION"='CURR_ENRL' AND "GLBEXTR_CREATOR_ID"='GSHOUL')
       filter(TO_NUMBER("GLBEXTR_KEY")="REL"."SIRASGN_PIDM" AND "GOBTPAC_PIDM"=TO_NUMBER("GLBEXTR_KEY"))
  70 - access("GOBTPAC_PIDM"="REL"."SIRASGN_PIDM")
  73 - access("B"."SIBINST_PIDM"="REL"."SIRASGN_PIDM")
  74 - access("A"."SIBINST_PIDM"="REL"."SIRASGN_PIDM" AND "A"."SIBINST_TERM_CODE_EFF"="MAX(B.SIBINST_TERM_CODE_EFF)")

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       filter("A"."SIBINST_PIDM"="GOBTPAC_PIDM" AND "ITEM_1"="A"."SIBINST_PIDM")
  75 - filter("A"."SIBINST_FCST_CODE"='AC' AND "A"."SIBINST_FCTG_CODE"<>'EMPL')
  78 - access("GOBTPAC_PIDM"="REL"."SIRASGN_PIDM")
  79 - filter("ITEM_1"="GOBTPAC_PIDM")
  81 - access("SIRASGN_TERM_CODE">="TOOLS"."GETTERMCODE"(NULL,SYSDATE@!) AND "SIRASGN_PIDM"="REL"."SIRASGN_PIDM")
       filter("SIRASGN_PIDM"="REL"."SIRASGN_PIDM")
  83 - access("C1"."SCBCRSE_SUBJ_CODE"='ACCT' AND "C1"."SCBCRSE_CRSE_NUMB"="SSBSECT_CRSE_NUMB")

139 rows selected. 

【问题讨论】:

  • 请运行解释计划并显示输出。
  • 其实我没有这个权限。我会要求它并在这里上传
  • 尝试将 where 移到子查询中:(SELECT * FROM (SELECT SSBSECT_TERM_CODE, .... ON term.stvterm_code=sect.ssbsect_term_code HERE--> WHERE Campus_code IN ('560','第598章
  • @PeterRing 不走运。仍需 2.4 分钟
  • “我没有这个权限。”这总是让我感到惊讶。解释计划始终是检查查询性能的第一个工具。这就像问机械师为什么发动机出现问题,然后拒绝将钥匙交给机械师(或拒绝为他启动汽车),以便他甚至可以尝试诊断问题。

标签: sql oracle oracle11g sqlperformance sql-tuning


【解决方案1】:

查询的性能取决于我们不知道的详细信息以及连接。一般来说,如果连接产生大量的行,那将消耗大量的 CPU 和内存。因此,请尝试添加 where 子句以最小化连接中的行数。

换一种说法,想象一下你是CPU。浏览您的查询并尝试估计您需要处理的行数,以及如何限制该行数。

您是否在关键表上使用索引来加快选择速度?您是否正在修改索引中使用的搜索列,以使索引不起作用?像这样的东西非常重要。

祝你好运!


更新:

该计划向我表明,大多数 CPU 都为最外层的查询而烧毁,您在计时测量中已经注意到了这一点。我的策略是尝试将最外层的 where 子句移向内部查询。如果数据库引擎可以在较早的阶段应用 where 子句,则查询将需要更少的内存和 cpu。

现在无法查看每个输出字段属于哪个表。如果我在你那里我会给每个 FROM 中的每个表一个别名。

为了测试性能并在此处发布,您可以简化输出字段列表。省略外部查询不需要的字段,或使用星号。另外,尝试呈现一个非常漂亮的打印查询。

除了计划,你能得到一些关于内存使用的信息吗?使用外部查询,可能需要在内存中获取大量数据才能输出结果。试想一下,如果这会导致 ram 耗尽并需要交换,那将花费大量时间。内存使用也可能来自对可能较大的表进行锁定,因此不要被“仅 18 行”的输出所迷惑。

【讨论】:

  • 包含连接的内部查询将在 13 秒内执行。那你觉得那里有问题吗??
  • 不一定。如果数据量大,查询复杂,cpu速度有限,13s可能比较合理。
  • 问题是内部查询需要 13 秒。但如果我运行包含 WHERE Campus_code IN ('560','598') 则需要 2.4 分钟
  • 额外的 where 子句意味着所有行必须分别与两个字符串值进行比较。线性搜索。多少行?许多许多行?什么样的磁盘? SSD,还是远程网络驱动器?为什么不用 where 子句创建一个测试查询呢?
  • Ram 也很重要。它交换了很多,还是有足够的内存来保存整个数据集?完全在 ram 中运行比大量使用磁盘快大约 1000 倍。
【解决方案2】:

您观察到 99% 的情况是在内联视图中合并谓词。

这通常可以正常工作并有助于提高性能,如下面的示例所示。

样本数据

 create table T1 as
 select 'xxxx'||rownum crampus_code from dual connect by level <= 100000;

 create index idx1 on t1(crampus_code);

由于必须访问整个表,因此该查询可能会在大表上花费大量时间。

 select crampus_code, count(*) from T1 group by crampus_code;

使用前一个查询作为子查询的后续查询可能非常有效。怎么样?

子查询中MERGE 中的WHERE 子句,仅访问(索引)和聚合两个键的数据。

with agg as
(
    select 
        a.crampus_code, count(*) 
    from 
        T1 a  
    group by 
        crampus_code
)
select * 
from agg
where crampus_code in ('xxxx42','xxxx399'); 

证明在执行计划中(你没有提供)

| Id  | Operation            | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      |     2 |    48 |     3   (0)| 00:00:01 |
|   1 |  SORT GROUP BY NOSORT|      |     2 |    48 |     3   (0)| 00:00:01 |
|   2 |   INLIST ITERATOR    |      |       |       |            |          |
|*  3 |    INDEX RANGE SCAN  | IDX1 |     2 |    48 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------

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

   3 - access("A"."CRAMPUS_CODE"='xxxx399' OR 
              "A"."CRAMPUS_CODE"='xxxx42')

您会看到只有两个键通过索引访问该表。

您的情况

这只是推测,但 IMO 在合并谓词阶段会得到一个更糟糕的执行计划,如果没有它。

这通过添加WHERE 子句来解释经过时间的增加。

只有同时显示两个计划(子查询和带有WHERE 的查询)才能确定...

解决方法

那么如果谓词合并破坏了性能怎么办?

简单地把它关掉。不幸的是,您必须使用未记录的提示MATERIALIZE,将查询结果设置为临时表 并且 WHERE 谓词将应用于它。

这应该适用于您的 18 行。我不确定,但是您必须使用子查询分解 (WITH) 重写查询。

with agg as
(select  /*+ MATERIALIZE */ a.crampus_code, count(*) from T1 a  group by crampus_code)
select * from agg
where crampus_code in ('xxxx42','xxxx399'); 

----------------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name                        | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |                             | 97325 |  3516K|    94   (5)| 00:00:02 |
|   1 |  TEMP TABLE TRANSFORMATION |                             |       |       |            |          |
|   2 |   LOAD AS SELECT           | SYS_TEMP_0FD9D673A_CE046F62 |       |       |            |          |
|   3 |    HASH GROUP BY           |                             | 97325 |  2281K|    41  (10)| 00:00:01 |
|   4 |     TABLE ACCESS FULL      | T1                          | 97325 |  2281K|    37   (0)| 00:00:01 |
|*  5 |   VIEW                     |                             | 97325 |  3516K|    54   (2)| 00:00:01 |
|   6 |    TABLE ACCESS FULL       | SYS_TEMP_0FD9D673A_CE046F62 | 97325 |  2281K|    54   (2)| 00:00:01 |
----------------------------------------------------------------------------------------------------------

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

   5 - filter("CRAMPUS_CODE"='xxxx399' OR "CRAMPUS_CODE"='xxxx42')

【讨论】:

  • 您好,我已经上传了执行计划,以便您可以更深入地了解问题。你能帮我分析一下吗?
  • @SumitPal 请按照here 的描述以文本形式发布执行计划,包括谓词信息(这很重要)。
  • 我已经上传了解释计划。你能帮忙吗?
  • @Ajit 所以这是你的慢查询运行 2 分钟,如果你运行子查询,只有 ist 快到 13 秒?如果是这样,您需要检查两个 执行计划并发现一些导致已用时间下降的根本变化。或者,您可以尝试重新编写查询如下:with agg as (select /*+ MATERIALIZE */ 'columbusstate' bk_.. rest of your subquery ) select * from agg WHERE campus_code IN ('560','1157')
【解决方案3】:

好的,我将把它放在“答案”中,因为 cmets 似乎被忽略了。

知道发生了什么以及如何解决问题的唯一方法是获取执行计划。否则每个答案都是猜测。您可能会很幸运,猜测有效,但您永远不会知道为什么。所以请帮助我们来帮助你。

要获得执行计划(对于带有和不带有 WHERE 子句的查询),请在查询之后运行它...

set lines 500
set pages 10000

select * from table( dbms_xplan.display_cursor( null, null, 'TYPICAL' ));

【讨论】:

  • 我今天会试一试。谢谢:)
  • 您好,我已经上传了执行计划。你能帮帮我吗?
  • 好的,我将要求对计划稍作改动;你能在sqlplus中做到吗?这将提供运行时统计信息。更改会话集统计级别=全部; select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
  • 我已经上传了完整的解释计划。你能帮忙吗?
【解决方案4】:

campus_code 是整数吗?如果是,请尝试删除撇号,如下所示:

WHERE campus_code IN (560,598)

否则,每个值都会在比较之前进行转换,这可能需要很长时间。

希望这会有所帮助。

【讨论】:

  • 不幸的是它不是整数:(
  • 像我建议的那样删除撇号会产生错误吗?
  • 否,但执行仍需要 2.4 分钟。
  • 如果没有执行计划或(最好是)SQL Monitor 报告,所有答案都将是猜测。
  • 嗯,下一个可能的罪魁祸首是该列 (campus_code) 或用于生成它的列上缺少索引。
猜你喜欢
  • 2021-09-24
  • 2013-02-06
  • 2010-09-14
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
相关资源
最近更新 更多