oracle的SQL为何慢于国产数据库

flzhang 2009-12-21 10:55:28
我想对一条SQL语句进行优化,原来的SQL是这样的

SELECT * FROM item, author WHERE item.i_a_id = author.a_id AND item.i_subject = 'arts' ORDER BY item.i_title limit 50

语意:找出前50本艺术类的书籍(这条SQL的语法是针对国产数据库的)

针对国产数据库优化的SQL
SELECT * FROM ( select * from item where item.i_subject = 'arts' ORDER BY item.i_title limit 50) aa, author WHERE aa.i_a_id = author.a_id

针对ORACLE优化的SQL
SELECT * FROM ( select * from(select * from item where item.i_subject = 'arts' ORDER BY item.i_title) where rownum<51 ) aa, author WHERE aa.i_a_id = author.a_id

在国产数据库和ORACLE上对比优化SQL的查询速度,ORACLE的速度比国产数据库差的比较多,无论是单条语句的执行还是并法测试时,想请大家帮我分析下,针对ORACLE的这种优化方式是不是最佳方式,是不是这种非最佳的优化方式造成ORACLE的查询速度不如国产数据库快呢?
如果有更好的对oracle的优化方式请指教 谢谢了!
...全文
876 42 打赏 收藏 举报
写回复
42 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
waterr 2010-10-14
  • 打赏
  • 举报
回复
oracle是大型数据库 稳定,安全性高 数据大量时就可以看出其速度了
小量数据 就用小行数据库就好 access就很方便
cuizhou5876 2010-09-03
  • 打赏
  • 举报
回复
lz用的什么国产的数据库.
Ma Ding 2010-07-18
  • 打赏
  • 举报
回复
up up up
xieyu_zy 2010-07-11
  • 打赏
  • 举报
回复
补充一下,如果通过WHERE返回结果集不太大,适当提高PGA中的SORT_AREA_SIZE的大小可以得到性能提高,因为之所以慢都是因为SORT_AREA_SIZE不够用,导致要到TEMP表空间(磁盘上)去做排序,速度自然就慢下来了。
xieyu_zy 2010-07-11
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 qldsrx 的回复:]
楼主你的查询语句就有问题,明显让Oracle跑慢了。


引用
针对ORACLE优化的SQL
SELECT * FROM (select * from item where item.i_subject = 'arts' ORDER BY item.i_title where rownum<=50 ) aa, author WHERE aa.i_a_id = author.a_id
[/Quote]

这种写法是错误的,因为ORACLE的ROWNUM是在ORDER BY以后生成的,如果没有ORDER BY可以这样写,有ORDER BY不行,可以自己拿一些数据做一下测试,按照时间倒序排列,插入的最新的数据未必会排在最前面。

如楼上几楼所说,ORACLE在小数据量上并不占优势,但是他能在全球占有54%的市场,并非没有他的能力,为什么他在小数据量上没有优势,为什么他又这么有优势,在于它的体系结构是非常好,但是由于其复杂性处理,所以在很多小数据量上还不如普通的数据库,就类似判定逻辑多了还不如将程序直接执行下去那样。ORACLE分页方式慢的原因主要有两个:
1、排序,根据结果集较大的排序。
2、结果集返回后,套两层分别定位数据范围,回表查询的量非常大(LZ可以用国产数据库试一试将翻页到第十万条多条上去,而不是查询前50条,这看不出什么效率问题)。

排序上几乎下不了太多动作,只是希望通过WHERE返回回来的数据可以尽量小(设计上),然后WHERE返回数据的速度尽量快(索引或分区的问题),排序(可以和上述字段建立联合索引),只返回ROWID,内层不适用 * 去定位数据(导致回表),通过返回50个ROWID后,回表提取数据(嵌套循环,绝对定位,比索引更快速),如果外部被关联表author的关联字段上也有索引(唯一性最好,不过能快速定位就好),也顺序通过这50条记录,嵌套循环,类似小结果集(50条)驱动大表的索引扫描的过程。
qldsrx 2010-07-05
  • 打赏
  • 举报
回复
楼主你的查询语句就有问题,明显让Oracle跑慢了。

引用
针对ORACLE优化的SQL
SELECT * FROM ( select * from(select * from item where item.i_subject = 'arts' ORDER BY item.i_title) where rownum<51 ) aa, author WHERE aa.i_a_id = author.a_id


改成这样你再去试试,看Oracle到底快不快:
SELECT * FROM (select * from item where item.i_subject = 'arts' ORDER BY item.i_title where rownum<=50 ) aa, author WHERE aa.i_a_id = author.a_id


之楚雄 2010-07-05
  • 打赏
  • 举报
回复
爱我中华,爱我数据库
行舟 2010-06-06
  • 打赏
  • 举报
回复
有技术支持什么数据库都可以啊!
zzyzgydotnet 2010-06-06
  • 打赏
  • 举报
回复
楼主说的这个国产数据库是什么?
dingjun123 2010-06-06
  • 打赏
  • 举报
回复
oracle既然烂,用国产的也不错嘛!~
什么大梦的还可以哦!
嘿嘿,不过oracle是国际公认的排在前列的数据库产品,我相信它不烂,只是很多人把它用的很烂
malun666 2010-06-06
  • 打赏
  • 举报
回复
oracle在整体软件结构的稳定性,兼容性,大数据量操作的性能等是国产数据库差距最大的地方。
国产数据库在速度和性能上已经有了很大提高,这是我们必须认同的。但是在稳定性和安全等方面还有很大提高的余地,要支持国产,支持民族品牌,首先我们国人要尊重我们的自主品牌!
yuhongpingimu 2010-06-06
  • 打赏
  • 举报
回复
哈哈。接分
半世码农 2010-06-01
  • 打赏
  • 举报
回复
帮顶
wudishentong 2010-06-01
  • 打赏
  • 举报
回复
不懂,帮顶,学习,蹭分.
iihero 2010-05-28
  • 打赏
  • 举报
回复
这么比较的话,我觉得sqlite都挺快的。呵呵。
zhongqq 2010-05-28
  • 打赏
  • 举报
回复
我感觉你的语句产生的数据量很少应该不会需要多少查询时间 ,两个对比也不会有太大差异。 但是索引的处理可能会影响很大,你看看索引的排序方式, 如何和你order by的排序方式相反就会有很大差异。
刘文钊1 2010-05-26
  • 打赏
  • 举报
回复
个人感觉,oracle速度上,稳定些吧,如果数据量大了,他的查询速度也不好下降很多,这样的代价就是,数据少的时候相对的,也不会很快,相对哈。
danfer97 2010-03-09
  • 打赏
  • 举报
回复
帮顶, 拿分
ALLOHA1984 2010-03-08
  • 打赏
  • 举报
回复
数据规模

1、 数据库大小无限制,单个表最大支持2TB或更大。
2、 支持千万条记录的大型数据。官方文档说已经出现40000张表,几亿条记录的应用。 1、 一个数据库文件2TB或更大。但是为了避免性能下降,最好不要超过10G。
2、 最大记录条数,受限于数据库文件的大小。LoadSpace监控数据量统计:添加50个计数器,每个计数器每小时大概产生100K的数据,15天连续监控数据量约为1.8G。
superdanpi 2010-02-19
  • 打赏
  • 举报
回复
explain plan for 上面的sql;做个执行计划分析 就可以看下oracle走是什么执行计划
加载更多回复(22)
相关推荐
发帖
Oracle 高级技术

3471

社区成员

Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
帖子事件
创建了帖子
2009-12-21 10:55
社区公告
暂无公告