最近单位对原有的学籍管理系统升级下,以前的系统是购买来的,用的ORACLE 8i。我以前没怎么研究过ORACLE数据库,所以现在在开发过程中遇到了点问题,希望大家帮忙。
主要是学生成绩表(表名student_scoreinfo_c)的问题。这个表没有设计主键(购买来的网站软件就是这样设计的,这让我觉得很崩溃),使用前三列的信息来区分,分别是student_id(学生的编号,这个是所有表都有的关联项)、study_year(学年)还有study_term(学期)来区分每一列的数据。数据量是16万行。
由于原来的数据上传机制的缺陷,其中有一些的重复数据。而我又不想删除重复的行(不知道原先系统的运作机制,贸然行动可能导致原有的网站系统崩溃),所以补设主键这种事情就行不通。
并且这个学生成绩表里面没有归属学校的代码,而对于每一个学校的用户肯定只能让它知道自己学校的数据。所以我只能通过在另一个表student_basic_info(数据量是150W)里面查找该学校所有学生的student_id,然后拿着这些ID在来成绩表里面查找。
用的SQL语句如下,假设了学校ID是1070。select * from student_scoreinfo_c where student_id in (select student_id from student_basic_info where school_id=1070)现在面临的情况是,当数据库启动后,第一次执行这个SQL语句时特别的慢,需要花费30秒以上的时间,作为测试数据库服务器的电脑硬盘狂转30秒+,而第二次以后就快了,只需要不到1秒的时间,即使查询其他学校也都很快。而其他得表查询则没有这样的现象,都很快。
因为我不是很了解ORACLE数据库的机制,所以来问问这种现象是怎么回事,又没有解决的办法,让第一次查询的时候不要这么长时间。
据我那少的可怜的经验,可能是ORACLE做了缓存的原因吧。但30秒+在16W数据里面查询出462条数据,也太费时间了……

解决方案 »

  1.   

    school_id列和student_id列上有索引没?
    有索引的话16W查出来462是不会全表扫描的
      

  2.   

    我看一下……完全没有,主键,索引什么的都没有……真是悲剧,需要加上索引么。
    另问一下,ORACLE索引怎么加上
      

  3.   


    create index student_scoreinfo_c_idx1 on student_scoreinfo_c(student_id);
    create index student_basic_info on student_scoreinfo_c(school_id);
      

  4.   

    create index student_scoreinfo_c_idx1 on student_scoreinfo_c(student_id);
    --这个index名字写错了。
    create index student_basic_info_idx1 on student_basic_info(school_id);
      

  5.   

    select * from student_scoreinfo_c a where exists (select 1 from student_basic_info  b where b.school_id=1070 and a.student_id = b.student_id)
      

  6.   


    很感谢你,但是依旧如故 32秒……
    这个问题应该不是SQL语句的问题。而是数据库配置的问题。在执行这个查询的时候,似乎将整个表遍历了一遍。所以就慢了。
    其实我刚才突然考虑到了另外一个问题。可能不是这个表慢了,是不是可能是其他的表快了。
      

  7.   

    select t1.* from student_scoreinfo_c t1,student_basic_info  t2
       where t1.student_id = t2.student_id  and t2.school_id=1070;