日期:2014-05-17  浏览次数:21004 次

ORACLE数据库的查询速度问题。
最近单位对原有的学籍管理系统升级下,以前的系统是购买来的,用的ORACLE 8i。我以前没怎么研究过ORACLE数据库,所以现在在开发过程中遇到了点问题,希望大家帮忙。
主要是学生成绩表(表名student_scoreinfo_c)的问题。这个表没有设计主键(购买来的网站软件就是这样设计的,这让我觉得很崩溃),使用前三列的信息来区分,分别是student_id(学生的编号,这个是所有表都有的关联项)、study_year(学年)还有study_term(学期)来区分每一列的数据。数据量是16万行。
由于原来的数据上传机制的缺陷,其中有一些的重复数据。而我又不想删除重复的行(不知道原先系统的运作机制,贸然行动可能导致原有的网站系统崩溃),所以补设主键这种事情就行不通。
并且这个学生成绩表里面没有归属学校的代码,而对于每一个学校的用户肯定只能让它知道自己学校的数据。所以我只能通过在另一个表student_basic_info(数据量是150W)里面查找该学校所有学生的student_id,然后拿着这些ID在来成绩表里面查找。
用的SQL语句如下,假设了学校ID是1070。

SQL code
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条数据,也太费时间了……

------解决方案--------------------
school_id列和student_id列上有索引没?
有索引的话16W查出来462是不会全表扫描的
------解决方案--------------------
SQL code


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);