场景1:
数据量在200万数据左右
表的结构中为一个time,ne,mo和100来个计数器字段,由于在时间为2天左右,数据量达到了200万左右
现在要查询这两天的数据,并要按照time,ne,mo进行排序.客户端只支持显示5万条,现在的做法是在服务端查询出200万,然后通过resultset进行遍历,只取出5万条
sql的写法为 
select time, ne,mo,counter1,counter2,counter3....counter100 from tablename where time > time1 and time <time2 and((ne='x1' and mo='y1') or (ne='x2' and mo='y2')...) order by time,ne,mo
现在出现的问题是 没有写order by的时候,速度很快就能出数据,有order by的时候,就会花20分钟才能出数据
其中根据time1和time2 和ne mo进行过滤没有多大效果,因为包涵了表里的所有范围.索引没有用上
在网上查了下资料,已经把temp表空间设置为了2g的空间,并重新设置了缓冲区告诉缓存和共享池的缓存大小分别为1g和300m,在设置前后没有多大影响.
请教各位大侠们,是否其他好的方法,对oracle数据库和sql的写法等方面进行优化呢?
场景2:
数据量在5000万到5亿之间,表的结构和上面一样,查询的sql写法也差不多,其中还可能通过time,ne,mo进行分组等
在这种情况下,如果设计表的索引?

解决方案 »

  1.   

    order by time,ne,mo --这里排序的字段加索引没,如果没加,加上试试.
      

  2.   

    如果是场景2的话,建议不要使用order by 或group by 了,只好对表进行水平分割和垂直分割来减少数据量。
    可以试试分区视图:
    创建分区视图  
      分区视图在一个或多个服务器间水平连接一组成员表中的分区数据,使数据看起来就象来自一个表。Microsoft&reg;   SQL   Server&#8482;   2000   区分本地分区视图和分布式分区视图。在本地分区视图中,所有的参与表和视图驻留在同一个   SQL   Server   实例上。在分布式分区视图中,至少有一个参与表驻留在不同的(远程)服务器上。此外,SQL   Server   2000   还区分可更新的分区视图和作为基础表只读复本的视图。  
       
      分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制使您能够扩大一组服务器,以支持大型的多层   Web   站点的处理需要。有关更多信息,请参见设计联合数据库服务器。  
       
      在实现分区视图之前,必须先水平分区表。原始表被分成若干个较小的成员表。每个成员表包含与原始表相同数量的列,并且每一列具有与原始表中的相应列同样的特性(如数据类型、大小、排序规则)。如果正在创建分布式分区视图,则每个成员表分别位于不同的成员服务器上。为了获得最大程度的位置透明度,各个成员服务器上的成员数据库的名称应当是相同的,但不要求非这样。例如:Server1.CustomerDB、Server2.CustomerDB、Server3.CustomerDB。  
       
      成员表设计好后,每个表基于键值的范围存储原始表的一块水平区域。键值范围基于分区列中的数据值。每一成员表中的值范围通过分区列上的   CHECK   约束强制,并且范围之间不能重叠。例如,不能使一个表的值范围从   1   到   200000,而另一个表的值范围从   150000   到   300000,因为这样将不清楚哪个表包含   150000   与   200000   之间的值。  
       
      例如,正在将一个   Customer   表分区成三个表。这些表的   CHECK   约束为:  
       
      --   On   Server1:  
      CREATE   TABLE   Customer_33  
          (CustomerID       INTEGER   PRIMARY   KEY  
                                      CHECK   (CustomerID   BETWEEN   1   AND   32999),  
          ...   --   Additional   column   definitions)  
       
      --   On   Server2:  
      CREATE   TABLE   Customer_66  
          (CustomerID       INTEGER   PRIMARY   KEY  
                                      CHECK   (CustomerID   BETWEEN   33000   AND   65999),  
          ...   --   Additional   column   definitions)  
       
      --   On   Server3:  
      CREATE   TABLE   Customer_99  
          (CustomerID       INTEGER   PRIMARY   KEY  
                                      CHECK   (CustomerID   BETWEEN   66000   AND   99999),  
          ...   --   Additional   column   definitions)  
       
      在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。