我想对一条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的优化方式请指教      谢谢了!
 

解决方案 »

  1.   

    select * 
    from (select item.i_title ,row_number()over (patition by item.i_title order by item.i_title as rn 
    from item, author WHERE item.i_a_id = author.a_id AND item.i_subject = 'art) 
    where rn <51 
      

  2.   

    Jane_64 我的优化是方式是先选出50条记录再做连接,这样不会比你的先在所有记录上做表连接,再选50条快么?
      

  3.   

    针对国产数据库优化的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慢,但优化的思路都是先找出50条记录在做表连接,为什么ORACLE会差很多呢?
      

  4.   

    不过一些中小型项目应用中,实践测试在普通的insert/update/delete/select操作中oracle并不见得有优势,而且相差挺大
    oracle的优势应该在于整体的解决方案,完整的产品系列和强大的技术背景,这也是好多小型DB能有一定市场的原因
      

  5.   

    我们做的就是对比测试,硬件环境,和使用的数据规模完全一样,只有优化后SQL不同,我们用的是一台数据库服务器和一台WEB服务器,在大用户并发访问时,ORACLE查询的性能也不如国产,难道ORACLE真的不如国产查询性能好么,如果我说的ORACLE的优化方式没问题,我会真的以为ORACLE的查询不如优化后的国产数据库,至少从测试结果看是这样的,但的确很想知道为什么ORACLE查询上会不如国产数据库呢?
      

  6.   

    把oracle语句的执行计划贴上来看看?你的sql优化有没有做到最优?
      

  7.   

    用优化工具查一下  你的ora-sql是否做到最优!呵呵!
    建议蹭分!哈哈
      

  8.   

    我觉得正常,你把foxpro 和 oracle比较一下就知道了
      

  9.   

    这是正常的,在数据量小的情况下,oracle确实比其他的数据库慢。但随着数据量的增加,oracle的速度并不会下降多少,而其他的数据库性能下降严重。
    另外,oracle的稳定性是其他数据库所不能比拟的。
      

  10.   

    希望国产的DB好起来,但现实情况是离国外的DB还有很长的距离
      

  11.   

    在数据量大是的情况下,oracle还是快些。你可以把数据量变大后,在试试。
      

  12.   

    explain plan for 上面的sql;做个执行计划分析 就可以看下oracle走是什么执行计划 
      

  13.   

    数据规模1、 数据库大小无限制,单个表最大支持2TB或更大。
    2、 支持千万条记录的大型数据。官方文档说已经出现40000张表,几亿条记录的应用。 1、 一个数据库文件2TB或更大。但是为了避免性能下降,最好不要超过10G。
    2、 最大记录条数,受限于数据库文件的大小。LoadSpace监控数据量统计:添加50个计数器,每个计数器每小时大概产生100K的数据,15天连续监控数据量约为1.8G。
      

  14.   

    个人感觉,oracle速度上,稳定些吧,如果数据量大了,他的查询速度也不好下降很多,这样的代价就是,数据少的时候相对的,也不会很快,相对哈。
      

  15.   

    我感觉你的语句产生的数据量很少应该不会需要多少查询时间 ,两个对比也不会有太大差异。 但是索引的处理可能会影响很大,你看看索引的排序方式, 如何和你order by的排序方式相反就会有很大差异。
      

  16.   

    这么比较的话,我觉得sqlite都挺快的。呵呵。
      

  17.   

    oracle在整体软件结构的稳定性,兼容性,大数据量操作的性能等是国产数据库差距最大的地方。
    国产数据库在速度和性能上已经有了很大提高,这是我们必须认同的。但是在稳定性和安全等方面还有很大提高的余地,要支持国产,支持民族品牌,首先我们国人要尊重我们的自主品牌!
      

  18.   

    oracle既然烂,用国产的也不错嘛!~
    什么大梦的还可以哦!
    嘿嘿,不过oracle是国际公认的排在前列的数据库产品,我相信它不烂,只是很多人把它用的很烂
      

  19.   

    楼主你的查询语句就有问题,明显让Oracle跑慢了。
    改成这样你再去试试,看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
      

  20.   


    这种写法是错误的,因为ORACLE的ROWNUM是在ORDER BY以后生成的,如果没有ORDER BY可以这样写,有ORDER BY不行,可以自己拿一些数据做一下测试,按照时间倒序排列,插入的最新的数据未必会排在最前面。如楼上几楼所说,ORACLE在小数据量上并不占优势,但是他能在全球占有54%的市场,并非没有他的能力,为什么他在小数据量上没有优势,为什么他又这么有优势,在于它的体系结构是非常好,但是由于其复杂性处理,所以在很多小数据量上还不如普通的数据库,就类似判定逻辑多了还不如将程序直接执行下去那样。ORACLE分页方式慢的原因主要有两个:
    1、排序,根据结果集较大的排序。
    2、结果集返回后,套两层分别定位数据范围,回表查询的量非常大(LZ可以用国产数据库试一试将翻页到第十万条多条上去,而不是查询前50条,这看不出什么效率问题)。排序上几乎下不了太多动作,只是希望通过WHERE返回回来的数据可以尽量小(设计上),然后WHERE返回数据的速度尽量快(索引或分区的问题),排序(可以和上述字段建立联合索引),只返回ROWID,内层不适用 * 去定位数据(导致回表),通过返回50个ROWID后,回表提取数据(嵌套循环,绝对定位,比索引更快速),如果外部被关联表author的关联字段上也有索引(唯一性最好,不过能快速定位就好),也顺序通过这50条记录,嵌套循环,类似小结果集(50条)驱动大表的索引扫描的过程。
      

  21.   

    补充一下,如果通过WHERE返回结果集不太大,适当提高PGA中的SORT_AREA_SIZE的大小可以得到性能提高,因为之所以慢都是因为SORT_AREA_SIZE不够用,导致要到TEMP表空间(磁盘上)去做排序,速度自然就慢下来了。
      

  22.   

    oracle是大型数据库   稳定,安全性高  数据大量时就可以看出其速度了  
    小量数据  就用小行数据库就好  access就很方便