高分讨论oracle数据库检索性能

toadzw 2011-05-23 03:46:52
加速可以建立相关的索引,不同索引存放不同分区,数据表本身放于不同分区,嵌套时将数据量大的放到外层等;但如果我现在有3000W条数据,对应表中的有一个ID,其建立了索引已经(表结构的东西已已经不可改动了,也就是不使用相关的分区得技术了),现在我想查id='55555555'一个特定值的,问一下这个过程会要多久,大家讨论看一下;


想给200分的,可是却最多只让我给100分;哈哈,明天再加分吧
...全文
322 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangqm22 2011-06-02
  • 打赏
  • 举报
回复
如果按前面你说的分区,索引,指定值,关键看你id='55555555'有多大数据量然后决定你显示的性能。
ycproc 2011-06-02
  • 打赏
  • 举报
回复
根据实际情况
没有具体的定论
不过一些最基本的规则不管是Oravle还是SQL都要遵守的
getmydream 2011-06-01
  • 打赏
  • 举报
回复
实际情况最具有说服力!
大米随笔 2011-05-25
  • 打赏
  • 举报
回复
可以用toad来对sql进行具体分析,toad可以按照你的sql以及表结构的情况做一个explain plan,并且给一个它认为最优的解决方案,具体的楼主所说执行时间,影响的因素很多,软硬环境、DB维护情况、表的设计等
javadaydayup 2011-05-25
  • 打赏
  • 举报
回复
我这里有个现成的
--测试表t_pc_vehicle 数据量2500W

--车牌号 带索引 (可重复,具体看重复数多少了,我这个查出是一条的),查询时间0.17秒
select * from t_pc_vehicle v where v.vehicle_no = 'TD沪A-3333'

--media_name 没有索引 ,查询时间108秒
select * from t_pc_vehicle v where v.media_name = 'abc'
liuyyuns 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 toadzw 的回复:]
再问一下7楼的,你的1000W条数据怎么插入的这样快呢
[/Quote]
我是用存储过程插入的,表里面就2个字段,创建存储过程的速度是很快的,但是执行存储过程的还是有点慢的。
toadzw 2011-05-24
  • 打赏
  • 举报
回复
再问一下7楼的,你的1000W条数据怎么插入的这样快呢
toadzw 2011-05-24
  • 打赏
  • 举报
回复
哈哈, 首先感谢一下7楼的
304的的哥 2011-05-24
  • 打赏
  • 举报
回复
要看你的表是那个属性字段分区的,如果你是按照id进行列表分区,那么应该很快,具体自己测测。
如果按照其他非主键字段分区,那么oracle将会按照这个id=‘55555555’进行多个分区的查询,
xieyu_zy 2011-05-23
  • 打赏
  • 举报
回复
这个我也算是路过,本来不想灌水的,不过看到了,就简单说下吧;

就像上面说的,这个具体情况具体分析,你说的假设中还存在很多不定性因素存在,而在一般情况下只能确定在这个字段有索引,你要找其中很少一部分数据,这部分数据一般在一个block中的话,会保持在几十毫秒以内,但是这个并非绝对值,而且这个也仅仅针对一些版本的oracle以及一定的配置环境和访问量下。

首先需要看的是这个ID的宽度以及是数字还是字符串,两者的索引长度是完全不一样的,一般来说几百万的数据,一般的索引层数保持在3~4层,而如果是主键索引,这部分是属于索引组织表,它的宽度是由数据的宽度影响的(在某些情况下主键索引未必是最快速的,尤其是在INDEX FAST FULL SCAN的时候,因为它的层数可能比其他索引要大)。

其次要看访问量,和cache是否命中,如果你的数据cache命中的话,可能在10ms左右就能返回,另外其他的访问可能会导致一定的排斥,尤其是再高并发的情况。还有就是在磁盘IO处索引磁盘和数据磁盘时候划分规范降低他们之间的征用,这里在并发访问的时候,还需要考虑存储设备的性能如:磁盘IOPS以及存储设备的控制器架构、存储设备的读写cache架构、存储设备的RAID方法或者ASM管理机制,如果在大数据量访问的时候还需要考虑带宽的情况。

最后如果IO未命中的情况下,设置存储的IO大小有关系,举个简单例子,如果一个block为32K用在了OLTP环境,而IO大小设置为2K,此时你在读取任何一条为在内存中命中的数据将会发生16次IO(而ORACLE读取数据不会半个块或者四分之一个块的读取,都是一块读取到内存,然后做LRU队列),这也是为什么OLTP应用的BLOCK一般都比较小,而OLAP比较大的一个重要原因;顺便说下:一般一块用于随机读写的本地硬盘在小IO测试下(顺序读写的磁盘适用于日志编写的高可用性缓存数据库),单个磁盘的IOPS一般极限是150个IOPS,其中还会划分出来读IOPS和写IOPS等等,所以一次读就干掉了16个(当然我举例有点极端,呵呵,只是想说明他的影响因素的确很多)。

还会有其他的影响情况,如锁机制的一致读需要到UNDO中获取等等都是需要时间开销的,这里仅仅就事论事,具体需要自己动手实践才可以得到在最适合的环境得到最佳的性能和稳定性,当然前提是要保证数据的准确性。呵呵!
njlywy 2011-05-23
  • 打赏
  • 举报
回复
这要看情况,没有个确定的…
liuyyuns 2011-05-23
  • 打赏
  • 举报
回复

--插入1000万条数据
SQL> create table test_A(id number(20) primary key,name varchar2(40));

Table created

SQL> select * from test_a;

ID NAME
--------------------- ----------------------------------------
create or replace procedure pro_test as
begin
for i in 1 .. 10000000 loop
insert into test_a values (i,'name'||'''||i||''');
end loop;
commit;
end;

Done in 0.141 secondes
SQL> exec pro_test;

PL/SQL procedure successfully completed

SQL> set timing on
SQL> select count(*) from test_a;

COUNT(*)
----------
10000000

Executed in 5.625 seconds

SQL> select count(*) from test_a;

COUNT(*)
----------
10000000

Executed in 3.703 seconds

SQL> select count(*) from test_a;

COUNT(*)
----------
10000000

Executed in 2.484 seconds
SQL> select * from test_a where id=100;

ID NAME
--------------------- ----------------------------------------
100 name'||i||'

Executed in 0.078 seconds
toadzw 2011-05-23
  • 打赏
  • 举报
回复
都假设过了啊,300W-1000W条数据
q270634296 2011-05-23
  • 打赏
  • 举报
回复
不是很清楚你的id是否是唯一的,如果唯一,我想不会超过3秒钟;如果有大量的重复数据,就很难说了。
tangren 2011-05-23
  • 打赏
  • 举报
回复
如果ID是主键,那这个就只跟软硬件配置有关了
hanks_gao 2011-05-23
  • 打赏
  • 举报
回复
如果id列上有唯一索引的话,查询时间应该在几十毫秒。
toadzw 2011-05-23
  • 打赏
  • 举报
回复
如果我现在有3000W条数据,对应表中的有一个ID,其建立了索引已经(表结构的东西已已经不可改动了,也就是不使用相关的分区得技术了),现在我想查id='55555555'一个特定值的,问一下这个过程会要多久;
情景我已经说出来了,我就是想看看这个速度有多快啊
gelyon 2011-05-23
  • 打赏
  • 举报
回复
具体问题具体分析,别人是不能直接就知道的。

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧