首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > 其他服务器 >

高分求SQL优化有关问题

2012-12-27 
高分求SQL优化问题有以下表结构:成绩表(CJB)结构 列名可空值否类型备注 -------------------------------

高分求SQL优化问题
有以下表结构:

成绩表(CJB)结构 

列名                          可空值否  类型              备注 
------------------------------- -------- ---- 
KCH                            NOT NULL VARCHAR2(10)      课程号 
KCM                                      VARCHAR2(50)      课程名 
KXH                                      NUMBER(4)          课序号 
XH                              NOT NULL VARCHAR2(12)      学号 
XNXQ                                    VARCHAR2(11)      学年学期 
XF                                      NUMBER(5,1)        学分 
XS                                      NUMBER(4,1)        学时数 
KCSX                                    VARCHAR2(4)        课程属性 
KSCJ                                    NUMBER(5,1)        考试成绩 
CXBKBZ                                  VARCHAR2(4)    成绩补考备注(补考,重修,辅修) 

... 

学籍表(XJB)结构: 

列名                          可空值否  类型            备注 
------------------------------- -------- ---- 
XH                              NOT NULL VARCHAR2(12)    学号 
XM                              NOT NULL VARCHAR2(40)    姓名 


XB                                      VARCHAR2(2)    性别 
XSH                                      VARCHAR2(5)    系所号 
ZYH                                      VARCHAR2(8)    专业号 
ZYFX                                    VARCHAR2(30)    专业方向(专业名) 
BM                                      VARCHAR2(10)    班级名称 
RXNJ                                    VARCHAR2(4)    入学年级 
SSNJ                                    VARCHAR2(4)    所属年级 
PYFS                                    VARCHAR2(20)    培养方式(层次) 
... 

系所表(XSB)结构: 

列名                          可空值否  类型            备注 
------------------------------- -------- ---- 
XSH                            NOT NULL VARCHAR2(5)      系所号 
XSM                                      VARCHAR2(30)    系所名称 

学分绩点转化表(XFJ)结构: 

列名                          可空值否  类型 
------------------------------- -------- ---- 
JDH                            NOT NULL NUMBER(2) 
JDS                                      NUMBER(2,1) 
XXF                                      NUMBER(5,1) 


SXF                                      NUMBER(5,1) 
BZ                                      VARCHAR2(20)  
以下是XFJ内的数据(各课程成绩通过这张表转换): 

JDH      JDS      XXF      SXF BZ 
--- --------- --------- --------- -------------- 
  1        4        90      100 A(优) 
  2      3.7        87      89.9 A- 
  3      3.3        84      86.9 B+ 
  4        3        81      83.9 B(良) 
  5      2.7        78      80.9 B- 
  6      2.3        75      77.9 C+ 
  7        2        72      74.9 C(中) 
  8      1.7        69      71.9 C- 
  9      1.3        66      68.9 D+ 
10        1        60      65.9 D 
12        0        0      59.9 F(不及格)        

用sql语句生成如下的形式的报表:
系别  学号  性别 专业  培养层次  必修课学分  限选课学分  任选课学分(通识、复合) 任选课学分(教育类) 重修课程门次 重修课程学分  平均学分绩点 
我的sql语句如下:
select xsb.xsm as 系别,xjb.zyfx as 专业,
       xjb.xh as 学号,xjb.xm as 姓名,
       xjb.XB as 性别,xjb.bm as 班号,
       xjb.PYFS as 培养方式, 
       sum(case 
       when x.kcsx='必修' and x.kscj>=60 
       then x.xf 
       else 0
       end
       ) as 必修课程学分,
       sum(case 
       when x.kcsx='限选' and x.kscj>=60 
       then x.xf else 0 
       end
       ) as 限选课学分, 
       sum(case 
       when (instr(x.kch,'G')!=0  or instr(x.kcm,'复合')!=0) and x.kcsx='任选' and x.kscj>=60 


       then x.xf 
       else 0 
       end 
       )  as 通识复合学分,
       sum(case 
       when instr(x.kch,'JY')!=0 and x.kscj>=60 
       then x.xf else 0 
       end 
       ) as 教育类课学分,
       sum(case 
       when x.kscj>=60 
       then x.xf 
       else 0 
       end
       )  as 总计学分,
       count(decode(x.cxbkbz,'补考',1,null)) as 补考课程门次,
       count(decode(x.cxbkbz,'重修',1,null)) as 重修课程门次,
       sum(decode(x.cxbkbz,'重修',x.xf,0)) as 重修学分数, 
       sum(x.jds*xf) as 总学分绩点 from jw.code_xsb ,jw.xj_xjb,    
       (select a.xh,a.kch,a.kcm,a.kcsx,a.cxbkbz,a.kscj,a.xf,max(b.JDS) as JDS 
       from cjb a,xfj b 
       where a.kscj>  =b.xxf and a.kscj  <=b.sxf 
             and a.kssj=(
             select max(kssj) from cjb where xh=a.xh and kch=a.kch) 
             group by 
             a.xh,a.kch,a.kcm,a.kcsx,a.cxbkbz,a.kscj,a.xf) x  
             where xsb.xsh = xjb.xsh and xjb.xh = x.xh 
                   and xjb.ssnj='2005' 
             group by xsb.xsm ,xjb.xh,xjb.xm,xjb.xb ,
             xjb.zyfx,xjb.bm,xjb.pyfs

我选出的记录只有3000多条,但执行时间需要花6分钟,请问如何优化呢?

[解决办法]
不懂,帮顶 ...
[解决办法]

引用:
不懂,帮顶 ...
不懂
[解决办法]
是什么数据库?  先看一下执行计划,确定瓶颈是什么。
[解决办法]
数据量大不大?可以set timing on。。。计算一下时间。。。如果数据量大的话建议用index
[解决办法]
帮顶。
感觉你发去sql区比较合适。

热点排行