Oracle SQL 优化全过程

来源:互联网 发布:Linux安装telnet yum 编辑:程序博客网 时间:2024/06/03 21:35
前两天写了一个课程结束时间的统计,要求是有课程所在院系、学生所在院系、课程相关信息以及课程结束时间等信息,其中课程结束时间是以星期做单位,没有太多思考,我很简单地写出了查询的SQL,但是执行效率太低,现将整个SQL的优化过程称述如下:
 
优化前:
 
视图一:

sql 代码
  1. CREATE OR REPLACE VIEW V_A_WEIXM_SUB_BAD   
  2. (TEACHINGCLASSID, TEACHINGCLASSNAME, TERMID, COURSENAME, COURSENO,    
  3.  TOTALPERIODNUM, CLASSNO, TERMNAME, DKNAME, STNAME,    
  4.  DSNAME, NUM, TEACHER1, TEACHER2, TEACHER3,    
  5.  BEGINWEEK, REST, WEEKDAY)   
  6. AS    
  7. select    
  8.     distinct a.teachingclassid,a.teachingclassname,a.termid,b.coursename,b.COURSENO,b.TOTALPERIODNUM,    
  9.     c.CLASSNO,l.TERMNAME,e.name dkname,h.NAME stname,j.NAME dsname,    
  10.     g.num,k.TEACHER1,k.TEACHER2,k.TEACHER3,a.BEGINWEEK,    
  11.     (select max(weekno) from caresult where caresult.teachingclassid=a.teachingclassid ) rest,    
  12.     decode(   
  13.  (   
  14.  select weekdayno from    
  15.  (   
  16.      select distinct max(s.weekdayno) weekdayno,s.teachingclassid from    
  17.      (   
  18.          select distinct max(weekno) weekno,teachingclassid from caresult group by teachingclassid    
  19.      ) m,caresult s    
  20.      where m.teachingclassid=s.teachingclassid and m.weekno=s.weekno group by s.teachingclassid   
  21.  ) where teachingclassid=a.teachingclassid   
  22.  )   
  23.   ,1,'星期一',2,'星期二',3,'星期三',4,'星期四',5,'星期五',6,'星期六',0,'星期日') WEEKDAY    
  24. from    
  25.     teachingtask a,course b,course_classes c,    
  26.     (select distinct classno,count(classno) num from students group by classno)g,    
  27.     staffroom h,classes i,     
  28.     TEACHERSETTING k,term l,department j,department e    
  29. where    
  30.     a.courseid=b.courseid and a.teachingclassid=c.teachingclassid and    
  31.     b.departmentid=e.departmentid and b.STAFFROOMID=h.STAFFROOMID and    
  32.     c.CLASSNO=i.CLASSNO and i.DEPARTMENTID=j.DEPARTMENTID and    
  33.     g.CLASSNO=c.CLASSNO and k.teachingclassid(+)=a.teachingclassid and    
  34.     a.TERMID=l.TERMID     
  35.     and a.TERMID='t012' order by e.name,h.NAME,b.COURSENO,b.coursename,teachingclassname;  

 
 
 
优化后:
 
视图二:

sql 代码
  1. CREATE OR REPLACE VIEW V_A_WEIXM_SUB   
  2. (TEACHINGCLASSID, TEACHINGCLASSNAME, TERMID, COURSENAME, COURSENO,    
  3.  TOTALPERIODNUM, CLASSNO, TERMNAME, DKNAME, STNAME,    
  4.  DSNAME, NUM, TEACHER1, TEACHER2, TEACHER3,    
  5.  BEGINWEEK, REST, WEEKDAY)   
  6. AS    
  7. select    
  8.     distinct a.teachingclassid,a.teachingclassname,a.termid,b.coursename,b.COURSENO,b.TOTALPERIODNUM,    
  9.     c.CLASSNO,l.TERMNAME,e.name dkname,h.NAME stname,j.NAME dsname,    
  10.     g.num,k.TEACHER1,k.TEACHER2,k.TEACHER3,a.BEGINWEEK,    
  11.     m.weekno rest,    
  12.     decode(m.weekdayno,1,'星期一',2,'星期二',3,'星期三',4,'星期四',5,'星期五',6,'星期六',0,'星期日') WEEKDAY    
  13. from    
  14.     teachingtask a,course b,course_classes c,    
  15.     (select distinct classno,count(classno) num from students group by classno)g,    
  16.     staffroom h,classes i,    
  17.     (    
  18.         select    
  19.             a.weekdayno,a.weekno,b.teachingclassid,a.trueflag from  
  20.             (select weekdayno,weekno,teachingclassid,(to_number(weekno)*10+to_number(weekdayno)) trueflag from caresult) a,    
  21.             (select teachingclassid,max(to_number(weekno)*10+to_number(weekdayno)) checkflag from caresult group by teachingclassid)b    
  22.         where b.teachingclassid=a.teachingclassid and b.checkflag=a.trueflag    
  23.     ) m,    
  24.     TEACHERSETTING k,term l,department j,department e    
  25. where    
  26.     a.courseid=b.courseid and a.teachingclassid=c.teachingclassid and    
  27.     b.departmentid=e.departmentid and b.STAFFROOMID=h.STAFFROOMID and    
  28.     c.CLASSNO=i.CLASSNO and i.DEPARTMENTID=j.DEPARTMENTID and    
  29.     g.CLASSNO=c.CLASSNO and k.teachingclassid(+)=a.teachingclassid and    
  30.     a.TERMID=l.TERMID  and m.teachingclassid(+)=a.teachingclassid    
  31.     and a.TERMID='t012' order by e.name,h.NAME,b.COURSENO,b.coursename,teachingclassname;  


 
0 0
原创粉丝点击