rownum取值影响组合索引的使用

本文探讨了在Oracle中使用RowNum进行数据检索时,不同数值设置对索引选择的影响。发现当RowNum小于20时,Oracle选择了全索引扫描;而当RowNum增大到200时,则更倾向于使用组合索引。通过对SQL执行计划的分析,指出在某些情况下,即使RowNum较小,使用组合索引也可能带来更高的效率。

创建一个组合索引,分别运行两个SQL,SQL唯一不同的地方是rownum<20rownum<200

create  index  IDX_TEL_ZU  on  t_s_Tel_Record(Employee_Id,Result)  online  nologging

--<例子1

SQL>  explain  plan  for 

    2   

    2    Select  *

    3        From  (Select  T0.*,  Rownum  As  Count_Id

    4                        From  (Select  Tel_Record_Id,

    5                                                  Employee_Id,

    6                                                  Customer_Id,

    7                                                  Callin_Number,

    8                                                  Calin_Time,

    9                                                  Recall_Number,

  10                                                  Extension,

  11                                                  Operation_Type,

  12                                                  Result,

  13                                                  Operator_Type_Id,

  14                                                  Operation_Desc

  15                                        From  t_s_Tel_Record

  16                                      Where  t_s_Tel_Record.Employee_Id  =  1067

  17                                          And  t_s_Tel_Record.Result  Is  Null

  18                                      Order  By  Tel_Record_Id  Desc)  T0

  19                      Where  Rownum  <=  20)  T1

  20      Where  Count_Id  >=  20  -  20  +  1;

 

Explained

 

SQL>  select  *  from  table(dbms_xplan.display);

 

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Plan hash value: 3591109256

----------------------------------------------------------------------------------------------------

| Id  | Operation                      | Name              | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT               |                   |    20 | 43660 |  3174   (1)| 00:00:39 |

|*  1 |  VIEW                          |                   |    20 | 43660 |  3174   (1)| 00:00:39 |

|*  2 |   COUNT STOPKEY                |                   |       |       |            |          |

|   3 |    VIEW                        |                   |    21 | 45570 |  3174   (1)| 00:00:39 |

|*  4 |     TABLE ACCESS BY INDEX ROWID| T_S_TEL_RECORD    | 18844 |   993K|  3174   (1)| 00:00:39 |

|   5 |      INDEX FULL SCAN DESCENDING| PK_T_S_TEL_RECORD | 12173 |       |    12   (0)| 00:00:01 |

----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   1 - filter("COUNT_ID">=1)

   2 - filter(ROWNUM<=20)

   4 - filter("T_S_TEL_RECORD"."EMPLOYEE_ID"=1067 AND "T_S_TEL_RECORD"."RESULT" IS NULL)

 

19 rows selected

 

上面没有走组合索引

 

=====================================================================

=====================================================================

下面改为200,走组合索引了

 

--<例子2

SQL> explain plan for

  2 

  2  Select *

  3    From (Select T0.*, Rownum As Count_Id

  4            From (Select /*+  index(t_s_Tel_Record IDX_TEL_ZU)*/

  5                         Tel_Record_Id,

  6                         Employee_Id,

  7                         Customer_Id,

  8                         Callin_Number,

  9                         Calin_Time,

 10                         Recall_Number,

 11                         Extension,

 12                         Operation_Type,

 13                         Result,

 14                         Operator_Type_Id,

 15                         Operation_Desc

 16                    From t_s_Tel_Record

 17                   Where t_s_Tel_Record.Employee_Id = 1067

 18                     And t_s_Tel_Record.Result Is Null

 19                  Order By Tel_Record_Id Desc

 20                   ) T0

 21           Where Rownum <= 200) T1

 22   Where Count_Id >= 20 - 20 + 1;

 

Explained

 

SQL> select * from table(dbms_xplan.display);

 

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Plan hash value: 2274292752

----------------------------------------------------------------------------------------------------------

| Id | Operation            | Name      | Rows | Bytes |TempSpc| Cost (%CPU)| Time   |

----------------------------------------------------------------------------------------------------------

|  0 | SELECT STATEMENT        |        |  200 |  426K|    | 4043  (1)| 00:00:49 |

|* 1 | VIEW              |        |  200 |  426K|    | 4043  (1)| 00:00:49 |

|* 2 |  COUNT STOPKEY         |        |    |    |    |      |     |

|  3 |  VIEW             |        | 18844 |  38M|    | 4043  (1)| 00:00:49 |

|* 4 |   SORT ORDER BY STOPKEY    |        | 18844 |  993K| 2968K| 4043  (1)| 00:00:49 |

|  5 |   TABLE ACCESS BY INDEX ROWID| T_S_TEL_RECORD | 18844 |  993K|    | 3785  (1)| 00:00:46 |

|* 6 |    INDEX RANGE SCAN     | IDX_TEL_ZU   | 18844 |    |    |  17  (6)| 00:00:01 |

----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

  1 - filter("COUNT_ID">=1)

  2 - filter(ROWNUM<=200)

  4 - filter(ROWNUM<=200)

  6 - access("T_S_TEL_RECORD"."EMPLOYEE_ID"=1067 AND "T_S_TEL_RECORD"."RESULT" IS NULL)

 

21 rows selected

 

=====================================================================

=====================================================================

rownum200就走组合索引,20就不走组合索引,我们看到取20的时候

INDEX FULL SCAN DESCENDING,这里就已经排序,oracle想通过全

索引扫描来避免order by(因为全索引扫描是排序的),而当取的数据

多了的时候,oracle认为排序和走组合索引效率更高。

 

实际上这里oracle判断出了问题, 因为不管是rownum这里取200还是20的时候

通过走组合索引的效率都要高于全索引扫描,在例子上我加如下hints

/*+ index(t_s_Tel_Record IDX_TEL_ZU)*/

效率仍然比走全索引扫描高,速度快了1

 

 

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10678398/viewspace-722127/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10678398/viewspace-722127/

SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( select a.id,a.project_id,p.proj_id as project_name,'铁舾装件' as major_name,b.parent_code as big_block, a.block, a.part_no,a.part_version||'' part_version,a.drawing_no,a.part_type,a.part_name,a.part_spec,'' as part_mat,'' as part_level, a.small_reg,c.middle_area_no,c.big_area_no,'' as meo, case when a.pro_stage =0 then '黑分段' when a.pro_stage =1 then '白分段' when a.pro_stage =2 then '区域' end pro_stage,a.instal_date,a.INSP_DATE ,a.MAT_DATE,a.PLAN_INSTAL_DATE,a.NEED_JSJ,INSP_REMARK from sof_instal_part a left join project_object_view b on a.project_id=b.project_id and a.block =b.code and b.type=3 left join PRODUCE_AREA_VIEW c on a.project_id = c.project_id and a.small_reg = c.small_area_no left join proj p on a.project_id =p.proj_no where a.project_id=3202 and a.DELETE_FLAG=0 and a.PENDING_FLAG=0 and a.TOP_VERSION_FLAG=1 and case when a.pro_stage =0 then '黑分段' when a.pro_stage =1 then '白分段' when a.pro_stage =2 then '区域' end in ('黑分段','白分段','区域') and a.small_reg in ('A800','OT03','OT01','OT02','A137','A116','A118','A155','A113','A106B','A102','A129','A131','A119','A121','A128','A108','A110','A150','A101','A100','A123','A134','A104','A122','A115','A130','A133','A135','A136','A139','A106A','A112','A153','A154','A138','A114','A117','A105','A132','A109','A107','A111','A125','A151','A152','T1102','T1101','A309','A336','A321','A335','A325','A312','A301','A300','A332','A356','A316','A319','A315','A314','A327','A305','A302','A326','A308','A320','A328','A311','A310','A330','A334','A306','A318','A322','A303','A329','A357','A317','A333','A324','A351','A354','A355','A313','A304','A353','A350','A352','A337','A323','A307','A331','A210','A252','A250','A206','A205','A261','A216','A251','A204','A203','A207','A201','A202','A260','A221','A200','A220','A209','A212','A215','A254','A208','A211','A214','A517','A518','A522','A525','A514','A516','A520','A527','A530','A532','A540','A553','A556','A510','A541','A507','A500','A513','A515','A519','A523','A501','A504A','A505','A529','A539','A506','A542','A511','A528','A535','A537','A504B','A508','A555','A524','A536','A512','A521','A526','A531','A533','A534','A538','A502','A503','A509','A543','A431','A433','A416','A420','A407','A403','A427','A455','A417','A419','A426','A409','A428','A429','A413','A414','A425','A432','A412','A423','A451','A410','A406','A408','A430','A456','A415','A401','A405','A411','A418','A421','A400','A460','A424','A402','F-DECK-OF02','E-DECK-OE01','C-DECK-OC01','D-DECK-OD02','MAIN-DECK-OM01','B-DECK-OB01','B-DECK-OB02','C-DECK-OC02','E-DECK-OE02','A-DECK-OA01','F-DECK-OF01','D-DECK-OD01','MAIN-DECK-OM02','A-DECK-OA02','A700','A704','A708','A714','A706','A707','A716','A703','A709','A756','A713','A718','A753','A701','A705','A710','A715','A719','A720','A721','A702','A755','A711','A712','A717','A603','A604B','A609','A612','A617','A621','A656','A639','A623','A600','A602','A604A','A605','A607','A608','A618','A624','A629','A630','A634','A637','A611','A653','A636','A601','A614','A615','A619','A625','A626','A628','A606','A632','A633','A635','A610','A613','A616','A620','A622','A627','A638','A655','A631','PB770C','B770P','PB770P','B770C','PB770S','B770S','B760S','PB760C','PB760P','B760P','PB760S','B760C','B740S-P','B740C-P','B740P-P','B720P-P','B720S-P','B720C-P','B720AC','B720AP','B720AS','PB720AC','PB720AP','PB720AS','PB720FS','B720FS','PB720FC','B720FP','PB720FP','B720FC','B710C','PB710C','B710S','B710P','PB710P','PB710S','PB740AC','B740AP','B740AC','PB740AS','PB740AP','B740AS','PB730S','PB730C','B730C','PB730P','B730P','B730S','B740FS','PB740FP','PB740FS','PB740FC','B740FC','B740FP','PB750C','B750C','B750S','B750P','PB750S','PB750P','F301','F300','F201','T1204','F109','F114','T1202','T1205','T1206','F108','F111','F112','F113','F115','F116','F103','F106','F202','F110','F206','T1201','F102','F204','F104','F107','F203','F205','T1203','F101','F105') AND a.instal_date IS not NULL UNION all select a.id,a.project_id,p.proj_id as project_name,'电气舾装件' as major_name,b.parent_code as big_block, a.object_code as block, a.PART_NUMBER,rev part_version,a.PRINT_NO,a.MAT_TYPE part_type,a.MAT_NAME part_name,a.MAT_DESP part_spec,'' as part_mat,'' as part_level, a.small_reg,c.middle_area_no,c.big_area_no,'' as meo, case when a.pro_stage =0 then '黑分段' when a.pro_stage =1 then '白分段' when a.pro_stage =2 then '区域' end pro_stage,a.instal_end_date,a.INSP_DATE ,a.MAT_DATE,a.PLAN_INSTAL_DATE,a.NEED_JSJ,INSP_REMARK from project_item_electric a left join project_object_view b on a.project_id=b.project_id and a.object_code =b.code and b.type=3 left join PRODUCE_AREA_VIEW c on a.project_id = c.project_id and a.small_reg = c.small_area_no left join proj p on a.project_id =p.proj_no where a.project_id=3202 and a.DELETE_FLAG=0 and a.PENDING_FLAG=0 and a.state=1 and case when a.pro_stage =0 then '黑分段' when a.pro_stage =1 then '白分段' when a.pro_stage =2 then '区域' end in ('黑分段','白分段','区域') and a.small_reg in ('A800','OT03','OT01','OT02','A137','A116','A118','A155','A113','A106B','A102','A129','A131','A119','A121','A128','A108','A110','A150','A101','A100','A123','A134','A104','A122','A115','A130','A133','A135','A136','A139','A106A','A112','A153','A154','A138','A114','A117','A105','A132','A109','A107','A111','A125','A151','A152','T1102','T1101','A309','A336','A321','A335','A325','A312','A301','A300','A332','A356','A316','A319','A315','A314','A327','A305','A302','A326','A308','A320','A328','A311','A310','A330','A334','A306','A318','A322','A303','A329','A357','A317','A333','A324','A351','A354','A355','A313','A304','A353','A350','A352','A337','A323','A307','A331','A210','A252','A250','A206','A205','A261','A216','A251','A204','A203','A207','A201','A202','A260','A221','A200','A220','A209','A212','A215','A254','A208','A211','A214','A517','A518','A522','A525','A514','A516','A520','A527','A530','A532','A540','A553','A556','A510','A541','A507','A500','A513','A515','A519','A523','A501','A504A','A505','A529','A539','A506','A542','A511','A528','A535','A537','A504B','A508','A555','A524','A536','A512','A521','A526','A531','A533','A534','A538','A502','A503','A509','A543','A431','A433','A416','A420','A407','A403','A427','A455','A417','A419','A426','A409','A428','A429','A413','A414','A425','A432','A412','A423','A451','A410','A406','A408','A430','A456','A415','A401','A405','A411','A418','A421','A400','A460','A424','A402','F-DECK-OF02','E-DECK-OE01','C-DECK-OC01','D-DECK-OD02','MAIN-DECK-OM01','B-DECK-OB01','B-DECK-OB02','C-DECK-OC02','E-DECK-OE02','A-DECK-OA01','F-DECK-OF01','D-DECK-OD01','MAIN-DECK-OM02','A-DECK-OA02','A700','A704','A708','A714','A706','A707','A716','A703','A709','A756','A713','A718','A753','A701','A705','A710','A715','A719','A720','A721','A702','A755','A711','A712','A717','A603','A604B','A609','A612','A617','A621','A656','A639','A623','A600','A602','A604A','A605','A607','A608','A618','A624','A629','A630','A634','A637','A611','A653','A636','A601','A614','A615','A619','A625','A626','A628','A606','A632','A633','A635','A610','A613','A616','A620','A622','A627','A638','A655','A631','PB770C','B770P','PB770P','B770C','PB770S','B770S','B760S','PB760C','PB760P','B760P','PB760S','B760C','B740S-P','B740C-P','B740P-P','B720P-P','B720S-P','B720C-P','B720AC','B720AP','B720AS','PB720AC','PB720AP','PB720AS','PB720FS','B720FS','PB720FC','B720FP','PB720FP','B720FC','B710C','PB710C','B710S','B710P','PB710P','PB710S','PB740AC','B740AP','B740AC','PB740AS','PB740AP','B740AS','PB730S','PB730C','B730C','PB730P','B730P','B730S','B740FS','PB740FP','PB740FS','PB740FC','B740FC','B740FP','PB750C','B750C','B750S','B750P','PB750S','PB750P','F301','F300','F201','T1204','F109','F114','T1202','T1205','T1206','F108','F111','F112','F113','F115','F116','F103','F106','F202','F110','F206','T1201','F102','F204','F104','F107','F203','F205','T1203','F101','F105') AND a.instal_end_date IS not NULL UNION all SELECT a.id ,a.PROJ_NO PROJECT_ID,p.proj_id project_name,'管路支撑' major_name,c.parent_code as big_block,a.BLOCK block, a.SPOOL_CODE ,a.SPOOL_VERSION ||'' part_version,a.DRAW_ID drawing_no ,'管路支撑' part_type,'' part_name,'' part_spec,'' part_mat,'' part_level,a.SMALL_AREA_PRODUCE,d.middle_area_no,d.big_area_no,'' as meo, a.pro_stage,a.inst_date instal_date,a.insp_date ,a.MAT_DATE,a.PLAN_INSTAL_DATE,a.NEED_JSJ,a.INSP_REMARK FROM CP_PIPESUPPORT_TAB a left join proj p on a.proj_no =p.proj_no left join project_object_view c on a.proj_no=c.project_id and a.BLOCK =c.code and c.type=3 left join PRODUCE_AREA_VIEW d ON a.proj_no = d.project_id and a.SMALL_AREA_PRODUCE = d.small_area_no WHERE a.proj_no = 3202 AND a.DELETE_FLAG ='9' AND a.TOP_VERSION_FLAG ='8' AND a.IS_PENDING = '9' and a.pro_stage in ('黑分段','白分段','区域') and a.SMALL_AREA_PRODUCE in ('A800','OT03','OT01','OT02','A137','A116','A118','A155','A113','A106B','A102','A129','A131','A119','A121','A128','A108','A110','A150','A101','A100','A123','A134','A104','A122','A115','A130','A133','A135','A136','A139','A106A','A112','A153','A154','A138','A114','A117','A105','A132','A109','A107','A111','A125','A151','A152','T1102','T1101','A309','A336','A321','A335','A325','A312','A301','A300','A332','A356','A316','A319','A315','A314','A327','A305','A302','A326','A308','A320','A328','A311','A310','A330','A334','A306','A318','A322','A303','A329','A357','A317','A333','A324','A351','A354','A355','A313','A304','A353','A350','A352','A337','A323','A307','A331','A210','A252','A250','A206','A205','A261','A216','A251','A204','A203','A207','A201','A202','A260','A221','A200','A220','A209','A212','A215','A254','A208','A211','A214','A517','A518','A522','A525','A514','A516','A520','A527','A530','A532','A540','A553','A556','A510','A541','A507','A500','A513','A515','A519','A523','A501','A504A','A505','A529','A539','A506','A542','A511','A528','A535','A537','A504B','A508','A555','A524','A536','A512','A521','A526','A531','A533','A534','A538','A502','A503','A509','A543','A431','A433','A416','A420','A407','A403','A427','A455','A417','A419','A426','A409','A428','A429','A413','A414','A425','A432','A412','A423','A451','A410','A406','A408','A430','A456','A415','A401','A405','A411','A418','A421','A400','A460','A424','A402','F-DECK-OF02','E-DECK-OE01','C-DECK-OC01','D-DECK-OD02','MAIN-DECK-OM01','B-DECK-OB01','B-DECK-OB02','C-DECK-OC02','E-DECK-OE02','A-DECK-OA01','F-DECK-OF01','D-DECK-OD01','MAIN-DECK-OM02','A-DECK-OA02','A700','A704','A708','A714','A706','A707','A716','A703','A709','A756','A713','A718','A753','A701','A705','A710','A715','A719','A720','A721','A702','A755','A711','A712','A717','A603','A604B','A609','A612','A617','A621','A656','A639','A623','A600','A602','A604A','A605','A607','A608','A618','A624','A629','A630','A634','A637','A611','A653','A636','A601','A614','A615','A619','A625','A626','A628','A606','A632','A633','A635','A610','A613','A616','A620','A622','A627','A638','A655','A631','PB770C','B770P','PB770P','B770C','PB770S','B770S','B760S','PB760C','PB760P','B760P','PB760S','B760C','B740S-P','B740C-P','B740P-P','B720P-P','B720S-P','B720C-P','B720AC','B720AP','B720AS','PB720AC','PB720AP','PB720AS','PB720FS','B720FS','PB720FC','B720FP','PB720FP','B720FC','B710C','PB710C','B710S','B710P','PB710P','PB710S','PB740AC','B740AP','B740AC','PB740AS','PB740AP','B740AS','PB730S','PB730C','B730C','PB730P','B730P','B730S','B740FS','PB740FP','PB740FS','PB740FC','B740FC','B740FP','PB750C','B750C','B750S','B750P','PB750S','PB750P','F301','F300','F201','T1204','F109','F114','T1202','T1205','T1206','F108','F111','F112','F113','F115','F116','F103','F106','F202','F110','F206','T1201','F102','F204','F104','F107','F203','F205','T1203','F101','F105') AND a.inst_date IS not NULL UNION all SELECT a.id ,a.PROJECT_ID ,p.proj_id project_name,'通风' major_name,c.parent_code as big_block, a.BLOCK block , a.TAG_NO ,'0' part_version,a.draw_id drawing_no ,a.CATEGORY part_type,a.MATERIAL_name part_name,a.SPECIFICATIONS part_spec,a.MATERIAL_QUALITY part_mat,'' part_level,a.small_area,d.middle_area_no,d.big_area_no,'' as meo, a.pro_stage,a.INSTALL_COMPLETE_DATE instal_date,a.insp_date ,a.MAT_DATE,a.PLAN_INSTAL_DATE,a.NEED_JSJ,INSP_REMARK FROM PROJECT_ITEM_HAVC a left join proj p on a.project_id =p.proj_no left join project_object_view c on a.PROJECT_ID=c.project_id and a.BLOCK =c.code and c.type=3 left join PRODUCE_AREA_VIEW d ON a.PROJECT_ID = d.project_id and a.small_area = d.small_area_no WHERE a.PROJECT_ID = 3202 AND a.IS_DELETE = 0 AND a.is_pause = 0 and a.pro_stage in ('黑分段','白分段','区域') and a.small_area in ('A800','OT03','OT01','OT02','A137','A116','A118','A155','A113','A106B','A102','A129','A131','A119','A121','A128','A108','A110','A150','A101','A100','A123','A134','A104','A122','A115','A130','A133','A135','A136','A139','A106A','A112','A153','A154','A138','A114','A117','A105','A132','A109','A107','A111','A125','A151','A152','T1102','T1101','A309','A336','A321','A335','A325','A312','A301','A300','A332','A356','A316','A319','A315','A314','A327','A305','A302','A326','A308','A320','A328','A311','A310','A330','A334','A306','A318','A322','A303','A329','A357','A317','A333','A324','A351','A354','A355','A313','A304','A353','A350','A352','A337','A323','A307','A331','A210','A252','A250','A206','A205','A261','A216','A251','A204','A203','A207','A201','A202','A260','A221','A200','A220','A209','A212','A215','A254','A208','A211','A214','A517','A518','A522','A525','A514','A516','A520','A527','A530','A532','A540','A553','A556','A510','A541','A507','A500','A513','A515','A519','A523','A501','A504A','A505','A529','A539','A506','A542','A511','A528','A535','A537','A504B','A508','A555','A524','A536','A512','A521','A526','A531','A533','A534','A538','A502','A503','A509','A543','A431','A433','A416','A420','A407','A403','A427','A455','A417','A419','A426','A409','A428','A429','A413','A414','A425','A432','A412','A423','A451','A410','A406','A408','A430','A456','A415','A401','A405','A411','A418','A421','A400','A460','A424','A402','F-DECK-OF02','E-DECK-OE01','C-DECK-OC01','D-DECK-OD02','MAIN-DECK-OM01','B-DECK-OB01','B-DECK-OB02','C-DECK-OC02','E-DECK-OE02','A-DECK-OA01','F-DECK-OF01','D-DECK-OD01','MAIN-DECK-OM02','A-DECK-OA02','A700','A704','A708','A714','A706','A707','A716','A703','A709','A756','A713','A718','A753','A701','A705','A710','A715','A719','A720','A721','A702','A755','A711','A712','A717','A603','A604B','A609','A612','A617','A621','A656','A639','A623','A600','A602','A604A','A605','A607','A608','A618','A624','A629','A630','A634','A637','A611','A653','A636','A601','A614','A615','A619','A625','A626','A628','A606','A632','A633','A635','A610','A613','A616','A620','A622','A627','A638','A655','A631','PB770C','B770P','PB770P','B770C','PB770S','B770S','B760S','PB760C','PB760P','B760P','PB760S','B760C','B740S-P','B740C-P','B740P-P','B720P-P','B720S-P','B720C-P','B720AC','B720AP','B720AS','PB720AC','PB720AP','PB720AS','PB720FS','B720FS','PB720FC','B720FP','PB720FP','B720FC','B710C','PB710C','B710S','B710P','PB710P','PB710S','PB740AC','B740AP','B740AC','PB740AS','PB740AP','B740AS','PB730S','PB730C','B730C','PB730P','B730P','B730S','B740FS','PB740FP','PB740FS','PB740FC','B740FC','B740FP','PB750C','B750C','B750S','B750P','PB750S','PB750P','F301','F300','F201','T1204','F109','F114','T1202','T1205','T1206','F108','F111','F112','F113','F115','F116','F103','F106','F202','F110','F206','T1201','F102','F204','F104','F107','F203','F205','T1203','F101','F105') AND a.INSTALL_COMPLETE_DATE IS not NULL UNION all SELECT a.PML_ITEM_NO id ,a.PROJ_NO PROJECT_ID,a.PROJECT_ID project_name,'管路小票' major_name,c.parent_code as big_block, a.block, a.SPOOL_CODE ,a.SPOOL_VERSION ||'' part_version,a.DRAW_ID drawing_no ,'管路小票' part_type,'' part_name,pipe_dia||'' part_spec,mat_attr part_mat,PIPE_CLASS part_level,a.SMALL_AREA,d.middle_area_no,d.big_area_no,'' as meo, a.pro_stage,a.inst_date instal_date,a.insp_date ,a.MAT_DATE,a.PLAN_INSTAL_DATE,a.NEED_JSJ,INSP_REMARK FROM PML_ITEM_MFGLIST_PIPESPOOL a left join project_object_view c on a.proj_no=c.project_id and a.BLOCK =c.code and c.type=3 left join PRODUCE_AREA_VIEW d ON a.proj_no = d.project_id and a.SMALL_AREA = d.small_area_no WHERE a.proj_no = 3202 AND a.DELETE_FLAG =9 AND a.TOP_VERSION_FLAG =8 AND IS_PENDING = 9 and a.pro_stage in ('黑分段','白分段','区域') and a.SMALL_AREA in ('A800','OT03','OT01','OT02','A137','A116','A118','A155','A113','A106B','A102','A129','A131','A119','A121','A128','A108','A110','A150','A101','A100','A123','A134','A104','A122','A115','A130','A133','A135','A136','A139','A106A','A112','A153','A154','A138','A114','A117','A105','A132','A109','A107','A111','A125','A151','A152','T1102','T1101','A309','A336','A321','A335','A325','A312','A301','A300','A332','A356','A316','A319','A315','A314','A327','A305','A302','A326','A308','A320','A328','A311','A310','A330','A334','A306','A318','A322','A303','A329','A357','A317','A333','A324','A351','A354','A355','A313','A304','A353','A350','A352','A337','A323','A307','A331','A210','A252','A250','A206','A205','A261','A216','A251','A204','A203','A207','A201','A202','A260','A221','A200','A220','A209','A212','A215','A254','A208','A211','A214','A517','A518','A522','A525','A514','A516','A520','A527','A530','A532','A540','A553','A556','A510','A541','A507','A500','A513','A515','A519','A523','A501','A504A','A505','A529','A539','A506','A542','A511','A528','A535','A537','A504B','A508','A555','A524','A536','A512','A521','A526','A531','A533','A534','A538','A502','A503','A509','A543','A431','A433','A416','A420','A407','A403','A427','A455','A417','A419','A426','A409','A428','A429','A413','A414','A425','A432','A412','A423','A451','A410','A406','A408','A430','A456','A415','A401','A405','A411','A418','A421','A400','A460','A424','A402','F-DECK-OF02','E-DECK-OE01','C-DECK-OC01','D-DECK-OD02','MAIN-DECK-OM01','B-DECK-OB01','B-DECK-OB02','C-DECK-OC02','E-DECK-OE02','A-DECK-OA01','F-DECK-OF01','D-DECK-OD01','MAIN-DECK-OM02','A-DECK-OA02','A700','A704','A708','A714','A706','A707','A716','A703','A709','A756','A713','A718','A753','A701','A705','A710','A715','A719','A720','A721','A702','A755','A711','A712','A717','A603','A604B','A609','A612','A617','A621','A656','A639','A623','A600','A602','A604A','A605','A607','A608','A618','A624','A629','A630','A634','A637','A611','A653','A636','A601','A614','A615','A619','A625','A626','A628','A606','A632','A633','A635','A610','A613','A616','A620','A622','A627','A638','A655','A631','PB770C','B770P','PB770P','B770C','PB770S','B770S','B760S','PB760C','PB760P','B760P','PB760S','B760C','B740S-P','B740C-P','B740P-P','B720P-P','B720S-P','B720C-P','B720AC','B720AP','B720AS','PB720AC','PB720AP','PB720AS','PB720FS','B720FS','PB720FC','B720FP','PB720FP','B720FC','B710C','PB710C','B710S','B710P','PB710P','PB710S','PB740AC','B740AP','B740AC','PB740AS','PB740AP','B740AS','PB730S','PB730C','B730C','PB730P','B730P','B730S','B740FS','PB740FP','PB740FS','PB740FC','B740FC','B740FP','PB750C','B750C','B750S','B750P','PB750S','PB750P','F301','F300','F201','T1204','F109','F114','T1202','T1205','T1206','F108','F111','F112','F113','F115','F116','F103','F106','F202','F110','F206','T1201','F102','F204','F104','F107','F203','F205','T1203','F101','F105') AND a.inst_date IS not NULL UNION all SELECT a.id,a.PROJECT_ID,p.proj_id as project_name,'电缆册' as major_name,c.parent_code as big_block, b.OBJECT_CODE block, a.cable_no part_no,a.rev||'' part_version,a.PRINT_NO drawing_no ,'电缆' part_type,'电缆' part_name,to_char(a.LENGTH||'m '||a.spec) part_spec,'' part_mat,'' part_level,b.SMALL_REG,d.middle_area_no,d.big_area_no,'' as meo, b.pro_stage,b.CONNECTION_FINISH_DATE instal_date,a.insp_date ,a.MAT_DATE,a.PLAN_INSTAL_DATE,a.NEED_JSJ,a.INSP_REMARK FROM CE_CABLE a left join proj p on a.project_id =p.proj_no LEFT JOIN T_EQUIPMENT b ON a.START_TAG_NO = b.TAG_NO AND a.PROJECT_ID = b.PROJECT_ID left join project_object_view c on a.project_id=c.project_id and b.object_code =c.code and c.type=3 left join PRODUCE_AREA_VIEW d on b.project_id = d.project_id and b.small_reg = d.small_area_no WHERE a.PROJECT_ID = 3202 AND a.is_delete = 0 AND a.IS_PENDING =0 and b.pro_stage in ('黑分段','白分段','区域') and b.SMALL_REG in ('A800','OT03','OT01','OT02','A137','A116','A118','A155','A113','A106B','A102','A129','A131','A119','A121','A128','A108','A110','A150','A101','A100','A123','A134','A104','A122','A115','A130','A133','A135','A136','A139','A106A','A112','A153','A154','A138','A114','A117','A105','A132','A109','A107','A111','A125','A151','A152','T1102','T1101','A309','A336','A321','A335','A325','A312','A301','A300','A332','A356','A316','A319','A315','A314','A327','A305','A302','A326','A308','A320','A328','A311','A310','A330','A334','A306','A318','A322','A303','A329','A357','A317','A333','A324','A351','A354','A355','A313','A304','A353','A350','A352','A337','A323','A307','A331','A210','A252','A250','A206','A205','A261','A216','A251','A204','A203','A207','A201','A202','A260','A221','A200','A220','A209','A212','A215','A254','A208','A211','A214','A517','A518','A522','A525','A514','A516','A520','A527','A530','A532','A540','A553','A556','A510','A541','A507','A500','A513','A515','A519','A523','A501','A504A','A505','A529','A539','A506','A542','A511','A528','A535','A537','A504B','A508','A555','A524','A536','A512','A521','A526','A531','A533','A534','A538','A502','A503','A509','A543','A431','A433','A416','A420','A407','A403','A427','A455','A417','A419','A426','A409','A428','A429','A413','A414','A425','A432','A412','A423','A451','A410','A406','A408','A430','A456','A415','A401','A405','A411','A418','A421','A400','A460','A424','A402','F-DECK-OF02','E-DECK-OE01','C-DECK-OC01','D-DECK-OD02','MAIN-DECK-OM01','B-DECK-OB01','B-DECK-OB02','C-DECK-OC02','E-DECK-OE02','A-DECK-OA01','F-DECK-OF01','D-DECK-OD01','MAIN-DECK-OM02','A-DECK-OA02','A700','A704','A708','A714','A706','A707','A716','A703','A709','A756','A713','A718','A753','A701','A705','A710','A715','A719','A720','A721','A702','A755','A711','A712','A717','A603','A604B','A609','A612','A617','A621','A656','A639','A623','A600','A602','A604A','A605','A607','A608','A618','A624','A629','A630','A634','A637','A611','A653','A636','A601','A614','A615','A619','A625','A626','A628','A606','A632','A633','A635','A610','A613','A616','A620','A622','A627','A638','A655','A631','PB770C','B770P','PB770P','B770C','PB770S','B770S','B760S','PB760C','PB760P','B760P','PB760S','B760C','B740S-P','B740C-P','B740P-P','B720P-P','B720S-P','B720C-P','B720AC','B720AP','B720AS','PB720AC','PB720AP','PB720AS','PB720FS','B720FS','PB720FC','B720FP','PB720FP','B720FC','B710C','PB710C','B710S','B710P','PB710P','PB710S','PB740AC','B740AP','B740AC','PB740AS','PB740AP','B740AS','PB730S','PB730C','B730C','PB730P','B730P','B730S','B740FS','PB740FP','PB740FS','PB740FC','B740FC','B740FP','PB750C','B750C','B750S','B750P','PB750S','PB750P','F301','F300','F201','T1204','F109','F114','T1202','T1205','T1206','F108','F111','F112','F113','F115','F116','F103','F106','F202','F110','F206','T1201','F102','F204','F104','F107','F203','F205','T1203','F101','F105') AND b.CONNECTION_FINISH_DATE IS not NULL UNION all SELECT a.id,a.PROJECT_ID,p.proj_id as project_name,'电缆册' as major_name,c.parent_code as big_block, b.OBJECT_CODE block, a.cable_no part_no,a.rev||'' part_version,a.PRINT_NO drawing_no ,'电缆' part_type,'电缆' part_name,to_char(a.LENGTH||'m '||a.spec) part_spec,'' part_mat,'' part_level,b.SMALL_REG,d.middle_area_no,d.big_area_no,'' as meo, b.pro_stage,b.CONNECTION_FINISH_DATE instal_date,a.insp_date ,a.MAT_DATE,a.PLAN_INSTAL_DATE,a.NEED_JSJ,a.INSP_REMARK FROM CE_CABLE a left join proj p on a.project_id =p.proj_no LEFT JOIN T_EQUIPMENT b ON a.end_TAG_NO = b.TAG_NO AND a.PROJECT_ID = b.PROJECT_ID left join project_object_view c on a.project_id=c.project_id and b.object_code =c.code and c.type=3 left join PRODUCE_AREA_VIEW d on b.project_id = d.project_id and b.small_reg = d.small_area_no WHERE a.PROJECT_ID = 3202 AND a.is_delete = 0 AND a.IS_PENDING =0 and b.pro_stage in ('黑分段','白分段','区域') and b.SMALL_REG in ('A800','OT03','OT01','OT02','A137','A116','A118','A155','A113','A106B','A102','A129','A131','A119','A121','A128','A108','A110','A150','A101','A100','A123','A134','A104','A122','A115','A130','A133','A135','A136','A139','A106A','A112','A153','A154','A138','A114','A117','A105','A132','A109','A107','A111','A125','A151','A152','T1102','T1101','A309','A336','A321','A335','A325','A312','A301','A300','A332','A356','A316','A319','A315','A314','A327','A305','A302','A326','A308','A320','A328','A311','A310','A330','A334','A306','A318','A322','A303','A329','A357','A317','A333','A324','A351','A354','A355','A313','A304','A353','A350','A352','A337','A323','A307','A331','A210','A252','A250','A206','A205','A261','A216','A251','A204','A203','A207','A201','A202','A260','A221','A200','A220','A209','A212','A215','A254','A208','A211','A214','A517','A518','A522','A525','A514','A516','A520','A527','A530','A532','A540','A553','A556','A510','A541','A507','A500','A513','A515','A519','A523','A501','A504A','A505','A529','A539','A506','A542','A511','A528','A535','A537','A504B','A508','A555','A524','A536','A512','A521','A526','A531','A533','A534','A538','A502','A503','A509','A543','A431','A433','A416','A420','A407','A403','A427','A455','A417','A419','A426','A409','A428','A429','A413','A414','A425','A432','A412','A423','A451','A410','A406','A408','A430','A456','A415','A401','A405','A411','A418','A421','A400','A460','A424','A402','F-DECK-OF02','E-DECK-OE01','C-DECK-OC01','D-DECK-OD02','MAIN-DECK-OM01','B-DECK-OB01','B-DECK-OB02','C-DECK-OC02','E-DECK-OE02','A-DECK-OA01','F-DECK-OF01','D-DECK-OD01','MAIN-DECK-OM02','A-DECK-OA02','A700','A704','A708','A714','A706','A707','A716','A703','A709','A756','A713','A718','A753','A701','A705','A710','A715','A719','A720','A721','A702','A755','A711','A712','A717','A603','A604B','A609','A612','A617','A621','A656','A639','A623','A600','A602','A604A','A605','A607','A608','A618','A624','A629','A630','A634','A637','A611','A653','A636','A601','A614','A615','A619','A625','A626','A628','A606','A632','A633','A635','A610','A613','A616','A620','A622','A627','A638','A655','A631','PB770C','B770P','PB770P','B770C','PB770S','B770S','B760S','PB760C','PB760P','B760P','PB760S','B760C','B740S-P','B740C-P','B740P-P','B720P-P','B720S-P','B720C-P','B720AC','B720AP','B720AS','PB720AC','PB720AP','PB720AS','PB720FS','B720FS','PB720FC','B720FP','PB720FP','B720FC','B710C','PB710C','B710S','B710P','PB710P','PB710S','PB740AC','B740AP','B740AC','PB740AS','PB740AP','B740AS','PB730S','PB730C','B730C','PB730P','B730P','B730S','B740FS','PB740FP','PB740FS','PB740FC','B740FC','B740FP','PB750C','B750C','B750S','B750P','PB750S','PB750P','F301','F300','F201','T1204','F109','F114','T1202','T1205','T1206','F108','F111','F112','F113','F115','F116','F103','F106','F202','F110','F206','T1201','F102','F204','F104','F107','F203','F205','T1203','F101','F105') AND b.CONNECTION_FINISH_DATE IS not NULL UNION all SELECT a.id ,a.PROJECT_ID ,p.proj_id project_name,'管路阀门附件' major_name,c.parent_code as big_block, a.BLOCK_NO block , a.EQUIP_TAG ,a.ANNEX_REV ||'' part_version,a.INST_DRAW_NO drawing_no ,a.EQUIP_TYPE part_type,a.EQUIP_DESCR part_name,a.EQUIP_SPEC part_spec,'' part_mat,'' part_level,a.SMALL_reg,d.middle_area_no,d.big_area_no,'' as meo, a.INST_STAGE_PLAN pro_stage,a.INST_FINISH_DATE instal_date,a.insp_date ,a.MAT_DATE,a.PLAN_INSTAL_DATE,a.NEED_JSJ,INSP_REMARK FROM CP_INST_EQUIPMENT a left join proj p on a.project_id =p.proj_no left join project_object_view c on a.PROJECT_ID=c.project_id and a.BLOCK_NO =c.code and c.type=3 left join PRODUCE_AREA_VIEW d ON a.PROJECT_ID = d.project_id and a.SMALL_reg = d.small_area_no WHERE a.PROJECT_ID = 3202 AND a.IS_DELETED = 0 AND a.TOP_VERSION_FLAG = 'Y' AND a.EQUIP_TAG LIKE 'ESP%' and a.INST_STAGE_PLAN in ('黑分段','白分段','区域') and a.SMALL_reg in ('A800','OT03','OT01','OT02','A137','A116','A118','A155','A113','A106B','A102','A129','A131','A119','A121','A128','A108','A110','A150','A101','A100','A123','A134','A104','A122','A115','A130','A133','A135','A136','A139','A106A','A112','A153','A154','A138','A114','A117','A105','A132','A109','A107','A111','A125','A151','A152','T1102','T1101','A309','A336','A321','A335','A325','A312','A301','A300','A332','A356','A316','A319','A315','A314','A327','A305','A302','A326','A308','A320','A328','A311','A310','A330','A334','A306','A318','A322','A303','A329','A357','A317','A333','A324','A351','A354','A355','A313','A304','A353','A350','A352','A337','A323','A307','A331','A210','A252','A250','A206','A205','A261','A216','A251','A204','A203','A207','A201','A202','A260','A221','A200','A220','A209','A212','A215','A254','A208','A211','A214','A517','A518','A522','A525','A514','A516','A520','A527','A530','A532','A540','A553','A556','A510','A541','A507','A500','A513','A515','A519','A523','A501','A504A','A505','A529','A539','A506','A542','A511','A528','A535','A537','A504B','A508','A555','A524','A536','A512','A521','A526','A531','A533','A534','A538','A502','A503','A509','A543','A431','A433','A416','A420','A407','A403','A427','A455','A417','A419','A426','A409','A428','A429','A413','A414','A425','A432','A412','A423','A451','A410','A406','A408','A430','A456','A415','A401','A405','A411','A418','A421','A400','A460','A424','A402','F-DECK-OF02','E-DECK-OE01','C-DECK-OC01','D-DECK-OD02','MAIN-DECK-OM01','B-DECK-OB01','B-DECK-OB02','C-DECK-OC02','E-DECK-OE02','A-DECK-OA01','F-DECK-OF01','D-DECK-OD01','MAIN-DECK-OM02','A-DECK-OA02','A700','A704','A708','A714','A706','A707','A716','A703','A709','A756','A713','A718','A753','A701','A705','A710','A715','A719','A720','A721','A702','A755','A711','A712','A717','A603','A604B','A609','A612','A617','A621','A656','A639','A623','A600','A602','A604A','A605','A607','A608','A618','A624','A629','A630','A634','A637','A611','A653','A636','A601','A614','A615','A619','A625','A626','A628','A606','A632','A633','A635','A610','A613','A616','A620','A622','A627','A638','A655','A631','PB770C','B770P','PB770P','B770C','PB770S','B770S','B760S','PB760C','PB760P','B760P','PB760S','B760C','B740S-P','B740C-P','B740P-P','B720P-P','B720S-P','B720C-P','B720AC','B720AP','B720AS','PB720AC','PB720AP','PB720AS','PB720FS','B720FS','PB720FC','B720FP','PB720FP','B720FC','B710C','PB710C','B710S','B710P','PB710P','PB710S','PB740AC','B740AP','B740AC','PB740AS','PB740AP','B740AS','PB730S','PB730C','B730C','PB730P','B730P','B730S','B740FS','PB740FP','PB740FS','PB740FC','B740FC','B740FP','PB750C','B750C','B750S','B750P','PB750S','PB750P','F301','F300','F201','T1204','F109','F114','T1202','T1205','T1206','F108','F111','F112','F113','F115','F116','F103','F106','F202','F110','F206','T1201','F102','F204','F104','F107','F203','F205','T1203','F101','F105') AND a.INST_FINISH_DATE IS not NULL UNION all SELECT a.id ,a.PROJECT_ID ,p.proj_id project_name,'全船设备' major_name,c.parent_code as big_block, a.OBJECT_CODE block , a.TAG_NO ,'0' part_version,a.draw_no drawing_no ,a.type part_type,a.tag_name part_name,'' part_spec,'' part_mat,'' part_level,a.SMALL_reg,d.middle_area_no,d.big_area_no,'' as meo, a.pro_stage,a.INSTAL_ENDTIME instal_date,a.insp_date ,a.MAT_DATE,a.PLAN_INSTAL_DATE,a.NEED_JSJ,INSP_REMARK FROM t_EQUIPMENT a left join proj p on a.project_id =p.proj_no left join project_object_view c on a.PROJECT_ID=c.project_id and a.OBJECT_CODE =c.code and c.type=3 left join PRODUCE_AREA_VIEW d ON a.PROJECT_ID = d.project_id and a.SMALL_reg = d.small_area_no WHERE a.PROJECT_ID = 3202 AND a.IS_DELETE = 0 AND IS_PENDING = '0' and a.pro_stage in ('黑分段','白分段','区域') and a.SMALL_reg in ('A800','OT03','OT01','OT02','A137','A116','A118','A155','A113','A106B','A102','A129','A131','A119','A121','A128','A108','A110','A150','A101','A100','A123','A134','A104','A122','A115','A130','A133','A135','A136','A139','A106A','A112','A153','A154','A138','A114','A117','A105','A132','A109','A107','A111','A125','A151','A152','T1102','T1101','A309','A336','A321','A335','A325','A312','A301','A300','A332','A356','A316','A319','A315','A314','A327','A305','A302','A326','A308','A320','A328','A311','A310','A330','A334','A306','A318','A322','A303','A329','A357','A317','A333','A324','A351','A354','A355','A313','A304','A353','A350','A352','A337','A323','A307','A331','A210','A252','A250','A206','A205','A261','A216','A251','A204','A203','A207','A201','A202','A260','A221','A200','A220','A209','A212','A215','A254','A208','A211','A214','A517','A518','A522','A525','A514','A516','A520','A527','A530','A532','A540','A553','A556','A510','A541','A507','A500','A513','A515','A519','A523','A501','A504A','A505','A529','A539','A506','A542','A511','A528','A535','A537','A504B','A508','A555','A524','A536','A512','A521','A526','A531','A533','A534','A538','A502','A503','A509','A543','A431','A433','A416','A420','A407','A403','A427','A455','A417','A419','A426','A409','A428','A429','A413','A414','A425','A432','A412','A423','A451','A410','A406','A408','A430','A456','A415','A401','A405','A411','A418','A421','A400','A460','A424','A402','F-DECK-OF02','E-DECK-OE01','C-DECK-OC01','D-DECK-OD02','MAIN-DECK-OM01','B-DECK-OB01','B-DECK-OB02','C-DECK-OC02','E-DECK-OE02','A-DECK-OA01','F-DECK-OF01','D-DECK-OD01','MAIN-DECK-OM02','A-DECK-OA02','A700','A704','A708','A714','A706','A707','A716','A703','A709','A756','A713','A718','A753','A701','A705','A710','A715','A719','A720','A721','A702','A755','A711','A712','A717','A603','A604B','A609','A612','A617','A621','A656','A639','A623','A600','A602','A604A','A605','A607','A608','A618','A624','A629','A630','A634','A637','A611','A653','A636','A601','A614','A615','A619','A625','A626','A628','A606','A632','A633','A635','A610','A613','A616','A620','A622','A627','A638','A655','A631','PB770C','B770P','PB770P','B770C','PB770S','B770S','B760S','PB760C','PB760P','B760P','PB760S','B760C','B740S-P','B740C-P','B740P-P','B720P-P','B720S-P','B720C-P','B720AC','B720AP','B720AS','PB720AC','PB720AP','PB720AS','PB720FS','B720FS','PB720FC','B720FP','PB720FP','B720FC','B710C','PB710C','B710S','B710P','PB710P','PB710S','PB740AC','B740AP','B740AC','PB740AS','PB740AP','B740AS','PB730S','PB730C','B730C','PB730P','B730P','B730S','B740FS','PB740FP','PB740FS','PB740FC','B740FC','B740FP','PB750C','B750C','B750S','B750P','PB750S','PB750P','F301','F300','F201','T1204','F109','F114','T1202','T1205','T1206','F108','F111','F112','F113','F115','F116','F103','F106','F202','F110','F206','T1201','F102','F204','F104','F107','F203','F205','T1203','F101','F105') AND a.INSTAL_ENDTIME IS not NULL ) TMP WHERE ROWNUM <=20) WHERE ROW_ID > 0 生成索引优化下速度
最新发布
12-17
<think>我们面对的是一个复杂的SQL查询,需要优化其性能。查询涉及多个表连接和过滤条件。我们将逐步分析并创建合适的索引。 ### 查询分析 1. **主表**: `sof_instal_part` (别名为`a`) 2. **连接表**: - `project_object_view` (别名为`b`) 连接条件: `a.project_id=b.project_id and a.block =b.code and b.type=3` - `PRODUCE_AREA_VIEW` (别名为`c`) 连接条件: `a.project_id = c.project_id and a.small_reg = c.small_area_no` - `proj` (别名为`p`) 连接条件: `a.project_id =p.proj_no` 3. **过滤条件**: - `a.project_id=3202` - `a.DELETE_FLAG=0` - `a.PENDING_FLAG=0` - `a.TOP_VERSION_FLAG=1` - `case when a.pro_stage =0 then '黑分段' when a.pro_stage =1 then '白分段' when a.pro_stage =2 then '区域' end in ('黑分段','白分段','区域')` (实际上这个条件总是满足,因为`pro_stage`的取值就是0,1,2,但优化器可能不知道,所以保留) - `a.small_reg in (...)` (一个很长的列表) 4. **分页**: 使用了`ROWNUM`进行分页(从第1行到第20行) ### 索引建议 #### 1. 主表 `sof_instal_part` (a) 在`sof_instal_part`表上,过滤条件包括: - `project_id=3202` - `DELETE_FLAG=0` - `PENDING_FLAG=0` - `TOP_VERSION_FLAG=1` - `pro_stage` (通过case转换,但实际是`pro_stage in (0,1,2)`) - `small_reg in (...)` 因此,我们可以在`sof_instal_part`上创建复合索引,将等值条件放在前面,范围条件放在后面。由于`project_id`是等值且选择性高,放在最前面。然后是三个标志位(都是等值),然后是`small_reg`(因为它是IN列表,也是等值),最后是`pro_stage`(虽然也是等值,但因为它出现在CASE表达式中,且条件总是满足,所以可以放在最后)。 但是注意,`pro_stage`的过滤条件实际上并不需要,因为它总是0,1,2,所以我们可以忽略它。所以,我们创建一个包含以下字段的索引: ```sql CREATE INDEX idx_sof_instal_part_main ON sof_instal_part ( project_id, DELETE_FLAG, PENDING_FLAG, TOP_VERSION_FLAG, small_reg ); ``` 另外,为了覆盖查询,我们可以考虑将查询中使用的其他列包含进去(使用覆盖索引避免回表),但这里查询所有列(`select *`,但实际上是主表的所有列加上一些连接列),所以覆盖索引可能太大。因此,我们只创建过滤条件的索引,然后通过回表获取数据。 #### 2. 连接表 `project_object_view` (b) 连接条件:`a.project_id=b.project_id and a.block =b.code and b.type=3` 建议为`project_object_view`创建索引: ```sql CREATE INDEX idx_project_object_view ON project_object_view (project_id, code, type); ``` #### 3. 连接表 `PRODUCE_AREA_VIEW` (c) 连接条件:`a.project_id = c.project_id and a.small_reg = c.small_area_no` 建议为`PRODUCE_AREA_VIEW`创建索引: ```sql CREATE INDEX idx_PRODUCE_AREA_VIEW ON PRODUCE_AREA_VIEW (project_id, small_area_no); ``` 注意:这个视图可能是一个简单视图,如果是复杂视图,我们需要确保基础表上有索引。 #### 4. 连接表 `proj` (p) 连接条件:`a.project_id =p.proj_no` 由于`proj`表通过`proj_no`连接,且`proj_no`应该是主键或唯一键,所以应该已经有索引。如果没有,则创建: ```sql CREATE INDEX idx_proj_proj_no ON proj (proj_no); -- 如果主键不存在 ``` #### 5. 关于分页 由于使用了`ROWNUM`进行分页,我们创建的索引应该能够快速定位到前20行。我们的索引`idx_sof_instal_part_main`已经可以高效过滤出符合条件的行,然后通过连接和分页,性能应该不错。 ### 总结索引创建语句 ```sql -- 主表索引 CREATE INDEX idx_sof_instal_part_main ON sof_instal_part (project_id, DELETE_FLAG, PENDING_FLAG, TOP_VERSION_FLAG, small_reg); -- 连接表索引 CREATE INDEX idx_project_object_view ON project_object_view (project_id, code, type); CREATE INDEX idx_PRODUCE_AREA_VIEW ON PRODUCE_AREA_VIEW (project_id, small_area_no); ``` ### 注意事项 1. 如果数据量非常大,并且`small_reg`的IN列表很长,索引可能会非常有效,因为数据库可以快速定位到这些行。 2. 由于使用了左连接,确保连接条件上的索引可以快速定位到关联行。 3. 如果视图中包含复杂的查询,可能需要为视图的基表创建索引。 ### 性能验证 创建索引后,使用执行计划(如Oracle的`EXPLAIN PLAN`)来确认索引是否被正确使用。确保查询使用我们创建的索引,并且连接操作是高效的。 ### 其他优化建议 - 如果`sof_instal_part`表非常大,可以考虑对`project_id`进行分区,因为查询中使用了`project_id=3202`。 - 检查连接表的数据量,如果连接表很大,确保连接列上有索引。 §§相关问题§§: 1. 如何分析SQL查询的执行计划以验证索引是否被使用? 2. 在Oracle中,如何创建覆盖索引以提高查询性能? 3. 当连接多个表时,如何优化连接顺序以提高查询效率? </think> ### SQL查询索引优化方案 根据您的复杂查询结构,我设计了以下索引优化方案(基于Oracle数据库): ```sql -- 主表索引(核心过滤) CREATE INDEX idx_sof_main ON sof_instal_part ( project_id, DELETE_FLAG, PENDING_FLAG, TOP_VERSION_FLAG, small_reg, pro_stage ) INCLUDE (instal_date, INSP_DATE, MAT_DATE, PLAN_INSTAL_DATE); -- 视图连接加速 CREATE INDEX idx_proj_obj_view ON project_object_view ( project_id, code, type ) INCLUDE (parent_code); CREATE INDEX idx_produce_area ON PRODUCE_AREA_VIEW ( project_id, small_area_no ) INCLUDE (middle_area_no, big_area_no); ``` ### 优化说明 1. **主查询过滤优化** 索引`idx_sof_main`覆盖了所有核心过滤条件: - 等值条件前置 (`project_id=3202`) - 布尔标志位组合 (`DELETE_FLAG=0`, `PENDING_FLAG=0`, `TOP_VERSION_FLAG=1`) - 区域过滤 (`small_reg IN(...)`) 和 生产阶段 (`pro_stage`) - `INCLUDE`子句避免回表操作 2. **连接性能提升** - `project_object_view`索引实现快速连接(`a.block = b.code`) - `PRODUCE_AREA_VIEW`索引加速区域关系查询(`a.small_reg = c.small_area_no`) 3. **分页优化** 索引自带排序特性(`small_reg`有序存储),结合`ROWNUM <=20`分页条件,可快速定位前20行 4. **CASE表达式处理** 虽然查询中有`CASE`转换,但实际`pro_stage in (0,1,2)`等价于`pro_stage <=2`,索引已包含该列 ### 执行计划验证建议 ```sql EXPLAIN PLAN FOR SELECT /*+ INDEX(a idx_sof_main) */ ...; ``` 检查执行计划确保: 1. `OPERATION`列显示`INDEX RANGE SCAN` 2. `OBJECT_NAME`为新创建索引 3. `COST`值显著降低(理想情况下降50%+) ### 分区表建议(适用于海量数据) 若`sof_instal_part`超百万行,增加分区提升性能: ```sql ALTER TABLE sof_instal_part PARTITION BY LIST (project_id) ( PARTITION p3202 VALUES (3202), PARTITION other VALUES (DEFAULT) ); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值