如何实现实时读取oracle中数百万甚至上千万条数据?要求相应时间不超过5秒!
如题,请大虾们探讨!
问题点数: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




