有一个简单应用,一个表大约17000条记录,每个记录大约有200多列,这个表总共40M左右的容量,有N个这样的表,每个表结构一样的,查询语句很简单,取出表中的90%数据,select colx,coly from table_x where time between start and end,其中time为索引,这个语句不走索引这个是正确的,当一个用户执行的时候大约只有2秒,当10个用户并行的时候(每个用户确定查不同的表,程序模拟)速度变成40多秒,后台数据库的读取速度为每次读8M字节左右,怎样能提高并行效率啊?

解决方案 »

  1.   

    单cpu的服务器的话,你不管怎么设计并行数,最终执行时都是需要串行化的,
      

  2.   

    首先我同意楼上者的说法:为什么要返回90%这样的要求?另外ORACLE在使用SELECT /*+parallel(表名称,并行度)*/进行查询时,需要在多SERVER集群下才可以充分发挥优势,否则在找不到集群SERVER下不它会搜索集群下的SERVER,如果找不到会重试一段时间,这个可以在一些机器上做一些简单测试,速度会很大程度上降低;所以不但不能发挥优势,还会降低查询速度;另外一般用于统计情况下较多,也只能提高提取和计算速度,而不能提高反馈速度,你上述描述的每张表40M,也就是说90%是36M,我们但不说其他的转换内容,也就是你需要查询,至少通过网卡反馈到客户端的内容有几十M的内容,2秒,已经没有什么可比的了(我还是那句话,为什么要反馈90%呢?)。你说10个用户呢?最少十倍吧,几百M的东西要输出去,能不慢嘛?就算用迅雷下载也得要点时间吧,而且如果你中间有应用服务器肯定还会有一些速度上的缓冲过程。还有一些内部的进程阻塞问题,你要加快提取速度,一个是增加磁盘整列,一个是加网卡,多个网卡进行分流等等吧。不过我还是建议分析为什么要90%的数据,类似于这样的查询几乎没有什么并发的情况,我们除了导出要用,基本不会把大量的数据一次拿出来,而是分页,而且分页也会去做一些处理,如何做到先分页、再回表、再关联的过程。
      

  3.   

    很明显LZ说的是并发环境,而不是并行查询。这个问题性能瓶颈肯定在I/O,但貌似没有什么特别好的方法。
      

  4.   

    谢谢各位的建议,之所以要返回这么多数据,而不让oracle自身去计算,而把最终的少量的计算结果返回给应用程序是因为要和我公司自己的数据库作比较,我不想用存储过程,也不想用PL/SQL,因为我们公司自己的数据库这些功能尚不健全,最终的解决方案为:
    1 更改表文件的INIT 为40M,,减少碎片,使得同一个表的数据连续存放:
    2 因为要返回大量数据,走索引随进访问速度变慢,所以强制走TABLE SCAN,而不是INDEX scan
    最终看我公司的数据库I/o由10M/S提到70M/S,问题解决,依然返回数据给应用程序(局域网)
    可经观察,仅仅这么一个简单的查询,oracle的I/O仍然没有提上去,依然是10M/S左右,现在问题是,不考虑程序更改,仅仅这个语句,如何能提高Oracle I/O,什么原因导致的如此慢,即使网络传输,局域网内的也不至于这么慢
      

  5.   

    什么版本的oracle?
    尽量的一次多读取block,可以调整下db_file_multiblock_read_count为最适合你的系统的值。
      

  6.   

    是要调db_file_multiblock_read_count 还是blocksize呢?