CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  开发

如何实现实时读取oracle中数百万甚至上千万条数据?要求相应时间不超过5秒!

楼主Yans(跟贴是一种友谊)2003-12-02 10:40:50 在 Oracle / 开发 提问

如题,请大虾们探讨!  
  问题点数:100、回复次数:33Top

1 楼Yans(跟贴是一种友谊)回复于 2003-12-02 10:43:35 得分 0

select语句中有条件,甚至可能要与其他表一起查询!Top

2 楼Yans(跟贴是一种友谊)回复于 2003-12-02 10:46:39 得分 0

我显示在listview中,用了虚拟listview,这个本身要占用时间,怎样在listview中实时显示查询的数据呢?Top

3 楼xinpingf(白开心)回复于 2003-12-02 10:47:39 得分 4

1000万条记录,即使不管查询条件  
   
  由数据库输出到前端,5秒钟能够完成吗?Top

4 楼yujiabian(流氓兔子雨)回复于 2003-12-02 11:26:35 得分 4

好像很很很困难哦,呵呵,找个高高手帮你回答吧,顶一下Top

5 楼Yans(跟贴是一种友谊)回复于 2003-12-02 13:23:09 得分 0

查询出来的数据没有那么多?可能几万、几十万条纪录,但也很慢!因为查询时有很多条件限制!好像增加了条件限制,使查询的纪录减少,但查询速度也很慢!如果没有查询条件,查询出的纪录有很多!速度也很慢!这是一个矛盾阿!不知怎么解决!Top

6 楼billqubillqu(billqu)回复于 2003-12-02 13:42:50 得分 4

如果这个表的insert、update、delete的操作不多,  
  可以把这个表设置成内存表,会大大提高查询速度。Top

7 楼billqubillqu(billqu)回复于 2003-12-02 13:43:54 得分 5

同时注意查询条件中的字段加索引Top

8 楼yujiabian(流氓兔子雨)回复于 2003-12-02 14:19:27 得分 5

可以运用索引,同时在联合查询的时候,注意数据量大的表和数据量小的表的前后次序Top

9 楼Mch1970(Mach)回复于 2003-12-02 14:52:56 得分 5

是不是在上百万上千万的数据中检索几条几百条数据?  
  而不是检索出上百万上千万数据,  
  在检索条件中的字段上加索引。  
   
  Top

10 楼ern(与Oracle斗,其乐无穷)回复于 2003-12-02 14:53:57 得分 1

你的要求也太高了,呵呵Top

11 楼leecooper0918(爱一个人好难)回复于 2003-12-02 18:14:45 得分 6

 
    硬件设施和优化SQL语句同时进行  
   
    硬件方面:   足够快的CPU和磁盘,足够大的内存,缓存也足够大.  
     
    SQL:    
          1.   使用索引和分区表。前提是表结构不存在问题.  
          2.   使用绑定变量而不是产量,能大幅提高share_pool的利用率  
          3.   如果有排序操作,设置SORT_AREA_SIZE为一个足够大的值,  
              尽可能让排序在内存中完成而不是使用temp表空间.  
   
  Top

12 楼leecooper0918(爱一个人好难)回复于 2003-12-02 18:15:42 得分 0

上面有个字写错了,"产量"应该是"常量".Top

13 楼liaolwj(风儿)回复于 2003-12-02 18:59:04 得分 6

还是把你的SQL优化一下吧Top

14 楼shanyuliang(良子)回复于 2003-12-02 19:51:28 得分 2

leecooper0918(PajeroFans),为啥常量不如绑定变量?理由?我就不这么认为,常量嘛,不变的,肯定比绑定变量快。Top

15 楼leecooper0918(爱一个人好难)回复于 2003-12-02 20:31:15 得分 6

 
      哎,不知怎么说你好。建议你多看看SQL优化的文章,然后自己试试.  
   
      你试试这样的sql语句,再用tkprof看看,你就明白了.  
       
        select   *   from   emp   where   name='abc'  
        select   *   from   emp   where   name='def'  
        select   *   from   emp   where   name='hig'  
        ...  
        和   select   *   from   emp   where   name   =:name  
   
      我只是举个简单的例子,科学地使用绑定变量能大幅提高效率.  
   
  Top

16 楼shanyuliang(良子)回复于 2003-12-02 20:44:38 得分 0

to   leecooper0918(PajeroFans),拜托,你这例子里面也不叫“常量”呀,'abc'和'def'和'hig'都不一样,怎么叫“常量”?“常量”是不变的嘛!Top

17 楼leecooper0918(爱一个人好难)回复于 2003-12-02 21:01:08 得分 1

我只是举个简单的例子,事实上很多的前台应用都是这么写的.  
  Top

18 楼shanyuliang(良子)回复于 2003-12-02 21:07:53 得分 1

你这个例子不好,里面没常量。你应该说“绑定变量比变量好”,这不就得了。Top

19 楼leecooper0918(爱一个人好难)回复于 2003-12-02 21:32:34 得分 6

 
    看来你还是没明白我的意思:  
   
        select   *   from   emp   where   name='abc'    
        这个查询如果在一台机器上执行了很多次,那么,OK,查询计划是  
        一样的;  
   
        但是,如果在另一台机器,用户查询的是:  
          select   *   from   emp   where   name='def'    
          这时,解析器还需要做解析,也就是硬解析(hard   parse)  
   
        假如一个大型的OLTP应用,并发用户数很多,每个用户都执行这样的  
        操作,会严重降低数据库的可伸缩性。  
   
        但是:         select   *   from   emp   where   name=   :emp   就不一样了,  
        解析器只会做一次解析,也就是软解析(Soft   Parse)  
   
        使用绑定变量最大的优势就是提高数据库的可伸缩性.  
   
   
   
   
           
   
   
  Top

20 楼shanyuliang(良子)回复于 2003-12-02 21:37:41 得分 0

to   leecooper0918(PajeroFans),你说的,我明白了。Top

21 楼chanet(牧师)回复于 2003-12-03 01:43:18 得分 1

关注...  
   
  但不太可能.   :-(Top

22 楼Yans(跟贴是一种友谊)回复于 2003-12-03 08:36:53 得分 0

我现在是这样做的:1、优化sql语句;具体就是用关键字查询!可是有些没有办法用关键字阿?Top

23 楼ManOfBCB(CB还有希望吗?)回复于 2003-12-03 17:46:12 得分 0

学习Top

24 楼bunnysky(松鼠)回复于 2003-12-03 18:04:41 得分 1

TO:leecooper0918(PajeroFans)   学习了Top

25 楼yuanming168(明月)回复于 2003-12-04 09:55:55 得分 6

大数据量的表的管理要进行分区管理(一般按时间分区),要提高查询速度就要尽量使用已建立的索引作为条件Top

26 楼yujiabian(流氓兔子雨)回复于 2003-12-04 10:16:33 得分 6

不知道你的表是单一索引还是符合索引?如果只是以id作为索引的话,那么你的select语句索引根本就没起作用,也就是说你执行的还是全表扫描,建议你将id,code,name作为该表的复合索引  
  以下的任何一种情况出现,都是全表扫描:  
  1〉该表无索引  
  2〉对返回的行无任何限制条件  
  3〉对数据表与任何索引主列相对应的行无限制条件,如:对id,name,code列上创建符合索引,那么仅对code列有限制条件的查询是不能使用这个索引的  
  4〉对索引主列的行有限制条件,但条件在表达式中使用,例如:在code列上索引,那么限制条件where   code='JIAYU458764'可以使用索引,而限定条件如果是where   upper(code)='JIAYU458764'不会使用索引  
  5〉对索引主列的行有限制条件,但条件或者是NULL检验或者是不相等。例如:  
  CODE列上存在索引,但以下情况不会使用索引:  
  WHERE   CODE   IS   NULL  
  WHERE   CODE   IS   NOT   NULL  
  WHERE   CODE!='JIAYU458764'  
  6>对索引主列的行有限制条件,但条件使用LIKE操作以及'%'开始或者值是一个赋值变量。  
  例如:  
  WHERE   CODE   LIKE   '%IAYU%'  
  WHERE   CODE   LIKE:CODE_BIND_VARIABLE  
  Top

27 楼yujiabian(流氓兔子雨)回复于 2003-12-04 11:13:22 得分 6

所以建议你使用复合索引试一下Top

28 楼yxzhjm(杨)回复于 2003-12-04 11:21:39 得分 6

读取数据的时间与计算机的性能和语句都有关系,  
  读取数据库只能仅可能用短时间读出来,你可以参照oracle_sql性能优化(在csdn上搜索一下),来优化你的sql语句,我想会极大地提高数据的读取速度,  
  Top

29 楼Yans(跟贴是一种友谊)回复于 2003-12-05 19:13:24 得分 0

那怎样才能很快的将数千条数据插入表中呢?传说中的存储过程怎么用啊?Top

30 楼leecooper0918(爱一个人好难)回复于 2003-12-05 20:32:54 得分 6

那怎样才能很快的将数千条数据插入表中呢?  
    --------------------------------------  
    提供一个速度飞快的插入代码,思路很好.  
   
      SQL>   create   table   t1(id   number(4))   nologging;  
      SQL>declare  
                type   numTab   is   table   of   number(4)   index   by   binary_integer;  
                data   numTab;  
                empty   numTab;  
        begin  
                  for   j   in   1   ..   5000   loop  
                          data(data.count+1)   :=   j;  
       
                          if   (   mod(data.count,1000)   =   0   )  
                        then  
                              forall   i   in   1   ..   data.count  
                                    insert   into   t1   values  
                                                    (   data(i)   );  
                              data   :=   empty;  
                        end   if;  
     
                end   loop;  
                if   (   data.count   is   not   null   )  
                then  
                        forall   i   in   1   ..   data.count  
                                    insert   into   t1   values  
                                                      (   data(i)   );  
                end   if;  
                commit;  
        end;  
        /  
   
      自己试试效率吧,插入5000条数据不到1秒.Top

31 楼Yans(跟贴是一种友谊)回复于 2003-12-06 14:15:41 得分 0

老大,可不可以翻译成cb阿?Top

32 楼ey21cn(Boone)回复于 2003-12-06 14:31:13 得分 6

查询采用‘%A’这样比查‘同A’要快Top

33 楼zhangshuyc(在北京)回复于 2003-12-06 15:44:12 得分 6

只有建索引了Top

相关问题

  • 小妹求教!!关于jsp操作oracle数据库操作的问题(文件读取,插入数据库表相应字段中)
  • 从数据库读取相应的数据?求助
  • delphi读取oracle数据库的大数据量的表出错?
  • asp可以直接读取oracle数据库的数据吗?
  • 读取数据
  • 在c#怎样将图片写入和读取oracle数据库
  • Recordset读取Oracle浮点型数据的问题
  • 如何在oracle中读取sqlserver的表的数据?
  • .NET是否可以读取Oracle for Unix的数据库?
  • 如何通过Oracle实时读取Access中的数据?

关键词

  • 查询
  • 数据
  • 语句
  • 优化
  • 数据库
  • 内存
  • 索引
  • 常量
  • 表
  • 条件

得分解答快速导航

  • 帖主:Yans
  • xinpingf
  • yujiabian
  • billqubillqu
  • billqubillqu
  • yujiabian
  • Mch1970
  • ern
  • leecooper0918
  • liaolwj
  • shanyuliang
  • leecooper0918
  • leecooper0918
  • shanyuliang
  • leecooper0918
  • chanet
  • bunnysky
  • yuanming168
  • yujiabian
  • yujiabian
  • yxzhjm
  • leecooper0918
  • ey21cn
  • zhangshuyc

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo