我有一个用户表,大概80万条数据,先查询出来放到临时表中,然后有个歌曲表,也大概有40万条数据,然后在把歌曲表和临时表关联起来查询,这时执行的数据就很慢了,我用的数据库是sybase,在查询的时候我先算出查询结果集的总数,然后通过循环一次值查询1000条数据。但是查询还是很慢,请问各位有什么好的办法帮我优化一下!提高查询的速度,请大家帮帮忙?谢谢!

解决方案 »

  1.   

    1、一定要用数据库连接池,无论什么方法什么形式。
    2、sybase不熟悉,不过如果有“视图”的话,先用它把数据过滤一把会加快很多
    3、还是sybase不熟悉,不知道你说的“通过循环一次值查询1000条数据”什么意思。尽量通过数据库提供的方法读取“一部分”数据,比如mysql就用top关键字,oracle用sql套sql的方法
    4、优化sql的写法,把能过滤很多条件的条件语句放在最后写,比如性别=男这样能剔除一大半的条件放在where的最后
    5、from后面的表的顺序也很重要,要把数据表写在master表之前,同样的,要把数据多的表放在数据少的表的前面
    (oracle是从后向前面解析sql文,所以4,5条不一定适合别的数据库)上面是我能想到的,其他的google一下别的方法吧,还有很多的小细节可以提高速度。good luck
      

  2.   

    对于sql的优化,我估计起不了很大的作用,因为我只查询用户表(大概80万数据)速度还是很快的,但是当我关连歌曲表(大概40万的数据)查询,速度就慢了。主要是在我的代码中有这样一个循环:我用户表有80万条数据,我循环800次,每次查询1000条数据,然后把这1000条数据保存到数据库中,因此,这样就影响到了查询的速度了,这个地方有没有好的方法处理,比如:我不每循环一次保存1000条数据,而是我全部查出来,然后在一次性保存到数据库中。
      

  3.   

    不知道sybase 数据库 是否支持表分区  如果支持可以考虑
      

  4.   

    没用过sybase,在Oracle中有insert into xxxxx (
    ) select aaa from yyy
    不知道可以不~
      

  5.   


    连接池改善的是创建连接时的性能,与查询无关,即使建立视图也需要创建相关的索引,视图可以简化程序中的 sql 语句。再就是如果数据的即时性不强,可以用临时表,像 warehouse 那样的东西。