读书人

大数据量怎么处理

发布时间: 2012-10-14 14:55:08 作者: rapoo

大数据量怎么办?

前言

前两天在工作中遇到了一个问题:在查询数据的时候非常的慢,十几分钟才响应,刚开始以为是网络原因,后来去别人那里连接数据库和查询语句都没有问题,然后就开始对程序和sql语句进行分析。

正题

通过询问别人和自己的分析,将问题主要锁定在了sql语句上。

原来的sql语句:

1:select count(t1.id) from t_user1t1,t_user2 t2 where t1.id=t2.id and t1.name!='无' and t2.password='123';


2: insert into t_user1 (id,name,pwd) values (select t.id,t.name,t.password from t_user2 t);

存在问题:

其实这两句sql语句乍一看没有问题,但是结合实际情况就有些问题了。


首先,最大的问题出在了第二条sql语句上,因为第三条语句是错误的。pwd和password不完全对应,所以在执行的时候会卡在那里。

其次,使用count()查询要遍历所有记录,而这两张表中各有三十多万条记录,所以会慢一些;但是也不会太慢,一般十多秒就可以;而我们平时查询的select * from t_user1是执行的oracle的分页查询,每次查询只是查询出来一部分(一般最多查询出来一千条记录),所以相比select * 查询速度要比count(*)要快一些。

另外,还有访问服务器的问题,由于公司一到下午访问服务器的人就多了,执行速度自然就慢了,而且这些插入很费时间,中间如果别人占用了服务器就容易卡住。

修改后的sql语句:

第一句没改,第二句改为了insert into t_user1 (id,name,password ) values (select t.id,t.name,t.password from t_user2 t);当然这需要把t_user1的相应的字段改了,如果不行可以改为insert into t_user1 (id,name,pwd) values (select t.id,t.name,""from t_user2 t);先给这个字段赋一个初始值(如果不需要拷贝t_user2表的password字段的值的话)。

另外,建立索引可以加快查询的速度(一般情况下,在建表的同时会给主键默认建上索引的),我们索引一般是建立在查询常用到的字段比如住外键,索引不能乱加,加多了反而会使得查询的速度变慢,具体查看查询是否用到了索引,可以查看执行计划,PL/SQL Developer下查看执行计划,只需要在写完sql语句后按F5即可查看。

小结:

对于优化sql语句,我们一定要先搞清楚它的不同的语句是如何执行的,这样我们才能够根据它的执行方法来优化我们的sql语句。

读书人网 >其他数据库

热点推荐