zoukankan      html  css  js  c++  java
  • [转]求海量数据的查询问题解决方案!!

    这个问题用oracle该如何解决??

    我需要用数据库存储中国移动的一些wap日志。
    比较变态的需求是:需要对这些日志进行统计。
    选择日期,查询某段日期内符合某些特征的访问记录。

    数据量的级别大概是几十亿条,几百G的数据。
    每天按最少500万条的速度递增。

    我做了个2000万条记录的测试。
    select from where
    select from group
    这些查询基本无法执行下去,实在太慢了!

    几十亿条的情况就不敢想了!!

    怎么办?怎么办?

    使用数据库的分区技术可以解决吗?
    谁有此方面经验给我提点好建议吧。
    另外,有哪些公司提供此方面的技术支持??

    :em02::em02:
    1. 用paratition和index确实很有帮助.基本能解决OLTP的需求
    2. 这个应该当DW的来做..直接从OLTP抽取。基本上是搞不定的..
    3. 用MV不知道行不行.你可以考虑一下..呵呵

    不需要用跪求吧,不懂不是错!

    不需要用跪求吧,不懂不是错!

    是啊,跪了也没用,还是不会做啊!
    2楼可否说的详细些?
    比如给我举个案例。

    用户去电信部门查自己的通话记录,也是从海量数据中抽取吧,它们是怎么做的?

    那么大的数据量,没有做过,希望高手出来说说经验
    个人感觉用分区表+分区索引,但是如此大的数据量,不知道效果如何!

    解决方案

    1。带条件的字段,添加索引
      如果带有where 条件语句的查询, 例如:
      select * from emp where sal>1000;
      create index sal_index on emp(sal);
      这样在查询满足条件sal〉1000时,就不会发生全表扫描。 而是先扫描sal索引,并找出符合条件的rowid,然后直接到表中找出记录,能大大加快查询时间。跟据你目前数据库是按照时间分段的情况。我建议你建立一个以时间字段索引
    比如电话开始时间字段  telstarttime date
    电话结束时间字段   telendtime  date
    创建两个索引:
    create index sarttime_index on telrecord(telstarttime);
    create index end_index on telrecord(telstarttim);
    利用索引进行查询,例查询出2006年4月6号的所有记录:
      select * from telrecord
      where telstartime>To_Date('2006/04/06 00:00:00' ,'yyyy/mm/dd HH24:mm:ss')
    and telendtime<To_Date('2006/04/06 23:59:59',,'yyyy/mm/dd HH24:mm:ss') ;
    这样查询的时候就会访问 sarttime_index  end_index 两个索引字段。并找出你需要的记录,可以大大降低访问时间。

    2。截断数据
    如果数据库中的表过于巨大,进行全表扫描会如果返回记录的数量巨大,比如几百万条数据。无论何种查询模式都不能实现快速的数据返回。一种方式就是建立分区表。按照时间段分开,比如一个月一个文件分区,这样做月统计的时候,就可以只访问一个分区的数据, 能够减轻访问的压力。

    3。统计计算
    可以把整体记录摘离出来,比如统计3月份的记录,可以建立一个临时表, 把符合3月份的记录先抽取出来,然后对这个临时表中的数据进行统计。这样数据库中可能有12个月的数据,我们只使用1/12的数据,可以大大加快统计的速度。

    4。以空间换时间
    计算速度和存储空间成反比,要提高计算的速度就要牺牲很多的空间。 统计的时候会发生这样的情况,就是要产生一系列的中间计算。如果都依靠回滚段和临时表空间来计算会非常耗费时间。需要你自己设计合理的数据库结构来提高计算的速度。
    本人在一个项目当中遇到过类似情况,在记录表中增加了一个24小时字段,减少了一个临时表的生成。将统计计算时间从原先的45分钟,减少到5分钟。 效益非常可观。


    建一些小的tables, 把每天的日志放到一个 table 里面。再做索引什么的。
    也可以把数据分散放到几个服务器上。比如 2005年的放到 server5.
    如果还不够快,可试用别的工具,如 Perl, SAS。
    也可试一下作网站日志分析报告的软件,如 NetTracker (http://www.sane.com/)

    利用分区表,按时间范围分区,并根据需要建立局部索引

    我们这边一个呼叫中心的话单是以每月建一个表来实现的
    全年12个月你就建12个表
    同时使用VIEW和INDEX 问题就解决了

    可以这么搞的:采用分区表模式

    假设过去将来5年(2006-2010)的数据量...

    首先创建5*12个LUN,一个LUN分别对用一个表空间(可以降低io),用来存放数据表,
        再创建5*12个LUN,一个LUN分别对应一个表空间,用来存放索引表。

    在120个LUN上分别建立表空间:eg
    create tablespace xxx_200601 DATAFILE  '/dev/rvol/rootdg/xxxx_200601' size 500M(根据实际大小) reuse extent management LOCAL UNIFORM SIZE 1M SEGMENT SPACE MANAGEMENT AUTO ;
    ....
    在创建索引表空间的时候可以指定: nologging 加快速度。因为你的索引可能会经常rebuild的。
    然后再创建分区表:
    create table xxx_data (
            C_POINT_ID NUMBER(10) NOT NULL,
            C_DATA_DATE NUMBER(10) NOT NULL,
            C_DATA_FLAG NUMBER(5) NOT NULL,
            C_DATA_VALUE NUMBER(15,4) ,
            C_DATA_STATUS NUMBER(10))
            partition by range (C_DATA_DATE)
            (
            partition t_data200601
            values less than ((to_date('20060201','YYYYMMDD')-to_date('19700101','YYYYMMDD')))
            tablespace t_data200601,
            partition t_data200602
            values less than ((to_date('20060301','YYYYMMDD')-to_date('19700101','YYYYMMDD')))
        ......
           )

    创建索引:
    create index  xxxx_index on xxx_data(C_POINT_ID,C_DATA_DATE,C_DATA_FLAG)
            local
            (partition t_data200601 tablespace idx_data200601,
             partition t_data200602 tablespace idx_data200602,
    ......);

    再建局部索引.....
    ......
    这样效率会高很多的!按月来查找是不是更快哦


    1楼兄弟是哪里的?假如是湖南的,可以找我的....

    和楼上的几位高手意见一样,分区。

    1 分区
    2 优化查询
    3 将olap业务和oltp业务分别放在不同的数据库上
  • 相关阅读:
    JSP 072: 处理注册结果样式的显示
    JSP 07: 开发注册页面
    JSP 06: 两个内置对象request和response
    Java Web 01: 什么是http协议
    JSP 05: JSP定义表达式和内容输出表达式
    JSP 04: 如何在JSP页面中书写Java代码
    JSP 03: 创建一个JSP页面并启动运行项目
    Fail 02: Port 8080 required by Tomcat Server at localhost is already in use.
    Fail 03: netstat 不是内部或外部命令
    Build 01: 安装新的JDK
  • 原文地址:https://www.cnblogs.com/xinyuxin912/p/1500942.html
Copyright © 2011-2022 走看看