我在 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')
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')
2.ORACLE适用千万级以上数据库。小数据量的还是用access,MYSQL吧
你把同样的数据在国产数据和foxpro中比较一下
oracle:TABLE ACCESS FULL
国产:Bitmap Index Scan oracle走全表扫描,国产走位图索引。差别在此。
-----------------------------------------
但是你贴的有些问题:
你说:
select * from item where item.i_subject='ARTS'
语意:找出所有艺术类的书籍 item表中数据10000条
但是执行计划:
TABLE ACCESS FULL| ITEM | 436
全表扫描,但是全表只有436条数据。
是否i_subject列基数很低?国产库上建的居然是位图索引。
在oracle中,oltp环境是绝对不敢用bitmap index的。
ITEM表一共有10000条数据arts相关的记录是436条,
TABLE ACCESS FULL| ITEM | 436 这条计划难道是说全表只扫描了436条,而不是10000条么?
还有,当ORACLE扫描的表如果比较小时,用全表扫描不是比索引还快么?国产数据库的位图索引可以明显提高速度么,会有什么负作用么?
你先回答我上面的问题,然后建对应索引看看。
ITEM表一共有10000条数据,arts相关的记录是436条,distinct i_subject有24个值
基数小有什么影响么?当ORACLE扫描的表如果比较小时,用全表扫描不是比索引更好么?国产数据库的位图索引可以明显提高速度么,会有什么负作用么?
我在i_subject上建索引了,但执行计划并未显示走索引,所以应该是ORACLE认为全表扫描小数据量时速度快于索引,所以这里用了全表扫描,但是还是比国产数据库慢,是不是国产数据库的用了位图索引才快的呢?
在oracle执行查询的时候首先要解析你的sql,然后根据优化器的规则(rule或cost)来给出执行路径,
第一次要硬解析,这个是相当耗费时间的,第二次再查的时候SGA中有原来sql语句解析过了,这个时候oracle不会再做硬解析,只做软解析,你多查几次,看看后面的时间,
还有跟你的oracle中db_catch_size大小有关,pga大小也有关系(命中率),这两个数据库不能统一而论的事,关于oracle的优化,可以说一本书,建议你看看oracle数据库优化方面的资料
明显是oracle的执行计划走错了,应该走索引,但oracle走了全表扫描。这一般在于oracle数据库中的一些参数设置不好时,oracle认为走全表扫描比走索引快导致的,这种情况在oracle中的小表很普遍。那个国产数据库应该是基本PostgreSQL数据库改造的吧?因为看执行计划是PostgreSQL的格式。12楼vc555的对国产数据库的执行计划的认识也不正确,“Bitmap Index Scan”在PostgreSQL也不是指索引是位图索引,而是扫描索引的一个类型,索引还是B树索引。而oracle经常会在小表上走全表扫描,即使实际情况下走索引更快的情况下?这是为什么呢?我遇到的情况是,一般oracle认为全表扫描是顺序扫描磁盘,认为顺序扫描16个块的cost值与随机扫描一个数据块的cost差不多,而这对于小表是错误的,因为小表的数据,很可能都装到了内存中,所以在内存中顺序扫描与随机扫描差别不大,所以oracle在这种情况下出了问题。