我在 ORACLE 11G 和 国产数据库上做了次对比测试语句很简单如下
select * from item where item.i_subject='ARTS'语意:找出所有艺术类的书籍 item表中数据10000条令该SQL分别在ORACLE 11G上和国产数据库上执行,无论是单条语句的测试还是并法测试,ORACLE的查询速度比国产数据库都慢,而且慢的比较多,想请大家帮我分析下到底是为什么?                                          谢谢了! 
                    
ORALCE 的执行计划:
Execution Plan
----------------------------------------------------------
Plan hash value: 244137614--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   436 |   229K|   215   (1)| 00:00:03 |
|*  1 |  TABLE ACCESS FULL| ITEM |   436 |   229K|   215   (1)| 00:00:03 |
--------------------------------------------------------------------------
国产数据库的执行计划1 Bitmap Heap Scan on ITEM  (cost=67.50..1024.19 rows=417 width=536) (actual time=0.210..0.690 rows=396 loops=1)
2   Recheck Cond: (I_SUBJECT = 'ARTS')
3   ->  Bitmap Index Scan on ITEM_I_SUBJECT  (cost=0.00..67.39 rows=417 width=0) (actual time=0.145..0.145 rows=396 loops=1)
4         Index Cond: (I_SUBJECT = 'ARTS')    

解决方案 »

  1.   

    1.计化和实际结果还是有一定差距的
    2.ORACLE适用千万级以上数据库。小数据量的还是用access,MYSQL吧
      

  2.   

    正常啊,
    你把同样的数据在国产数据和foxpro中比较一下
      

  3.   

    但问题是,现在的情况下ORALCE就比国产数据库慢,应该有个合理的解释吧,能从执行计划里分析下么原因么?
      

  4.   

    原因当然在执行计划了。
    oracle:TABLE ACCESS FULL
    国产:Bitmap Index Scan oracle走全表扫描,国产走位图索引。差别在此。
    -----------------------------------------
    但是你贴的有些问题:
    你说:
    select * from item where item.i_subject='ARTS' 
    语意:找出所有艺术类的书籍 item表中数据10000条 
    但是执行计划:
     TABLE ACCESS FULL| ITEM |  436 
    全表扫描,但是全表只有436条数据。
      

  5.   

    你这个item 倒底多少数据,还有i_subject列,distinct i_subject有多少值,为arts的又有多少?
    是否i_subject列基数很低?国产库上建的居然是位图索引。
    在oracle中,oltp环境是绝对不敢用bitmap index的。
      

  6.   


    ITEM表一共有10000条数据arts相关的记录是436条,
    TABLE ACCESS FULL| ITEM |  436  这条计划难道是说全表只扫描了436条,而不是10000条么?
    还有,当ORACLE扫描的表如果比较小时,用全表扫描不是比索引还快么?国产数据库的位图索引可以明显提高速度么,会有什么负作用么?
      

  7.   

    恩。对的。上面的436是返回的行数,我注意看到ELECT STATEMENT  |      |  436 | 也是436。
    你先回答我上面的问题,然后建对应索引看看。
      

  8.   


    ITEM表一共有10000条数据,arts相关的记录是436条,distinct i_subject有24个值
    基数小有什么影响么?当ORACLE扫描的表如果比较小时,用全表扫描不是比索引更好么?国产数据库的位图索引可以明显提高速度么,会有什么负作用么?
      

  9.   

    ORACLE的I_SUBJECT列上有索引,但应该是因为表较小,ORALCE使用了全表扫描而不是索引扫描
      

  10.   


    我在i_subject上建索引了,但执行计划并未显示走索引,所以应该是ORACLE认为全表扫描小数据量时速度快于索引,所以这里用了全表扫描,但是还是比国产数据库慢,是不是国产数据库的用了位图索引才快的呢?
      

  11.   

    强制走索引!select /*+index(table_name index_name)*/ * from table_name where i_subject=???????????????不要说oracle不如国产的,你试试TB级的数据,小数据量的mysql在某些方面比oracle要快,但是上了GB就不见得了,毕竟核心技术在人家外国人手中掌握着
      

  12.   

    还有个问题就是优化器的选择,是rule的还是cost,两者的解析计划执行路径是不一样的,从oracle9i开始默认的是cost,基于cost的优化器,
    在oracle执行查询的时候首先要解析你的sql,然后根据优化器的规则(rule或cost)来给出执行路径,
    第一次要硬解析,这个是相当耗费时间的,第二次再查的时候SGA中有原来sql语句解析过了,这个时候oracle不会再做硬解析,只做软解析,你多查几次,看看后面的时间,
    还有跟你的oracle中db_catch_size大小有关,pga大小也有关系(命中率),这两个数据库不能统一而论的事,关于oracle的优化,可以说一本书,建议你看看oracle数据库优化方面的资料
      

  13.   

    这个问题其它也没有大家说的那么复杂,也没有上升到国产数据库比oracle快还是慢的高度。
    明显是oracle的执行计划走错了,应该走索引,但oracle走了全表扫描。这一般在于oracle数据库中的一些参数设置不好时,oracle认为走全表扫描比走索引快导致的,这种情况在oracle中的小表很普遍。那个国产数据库应该是基本PostgreSQL数据库改造的吧?因为看执行计划是PostgreSQL的格式。12楼vc555的对国产数据库的执行计划的认识也不正确,“Bitmap Index Scan”在PostgreSQL也不是指索引是位图索引,而是扫描索引的一个类型,索引还是B树索引。而oracle经常会在小表上走全表扫描,即使实际情况下走索引更快的情况下?这是为什么呢?我遇到的情况是,一般oracle认为全表扫描是顺序扫描磁盘,认为顺序扫描16个块的cost值与随机扫描一个数据块的cost差不多,而这对于小表是错误的,因为小表的数据,很可能都装到了内存中,所以在内存中顺序扫描与随机扫描差别不大,所以oracle在这种情况下出了问题。