|
我想,大家的讨论忽略了一个前提,就是你是采用RBO还是采用CBO得出的结论。
在RBO和CBO下,执行路径通常都是不同的,CBO下一般情况下能够选择最小开销。
1.关于TABLE JOIN
RBO:
-->ligengocp:3,两个表进行JION时,大表放在前面,JION字段建索引
-->chao_ping:两表进行Join,应该是小的表放在前面效率更加好一点?
-->我的看法:很明确,小表放后头,RBO下,驱动表在后面,也即总是对后面的表全扫描。
CBO:
如果优化器选择NESTED LOOP的话,无所谓前后,Oracle会自动选择小表全扫描。
2.关于COUNT(*)(前提是没有加where语句,where语句又导致不同的执行路径)
RBO:
--> ligengocp:7,如要统计大表的记录条件,用COUNT(*)优于COUNT(某列)
-->chao_ping:关于count,应该是没有差别的。你对你的执行结果的explain plan看看,应该是一样的。
时间不一样,可能是第一次有物理读,第二次已经在内存里面读取造成的影响。
-->我的看法:
chao_ping对的,count(*),count(column)都是导致全表扫描。
CBO:
-->chao_ping:如果有索引的话,都会用Fast Full Index Scan的
如果表上有INDEX,Oracle会选择开销最小的index进行INDEX (FULL SCAN),
单不会进行Fast Full Index Scan,就算count(column)也不会。
3.关于bitmap index
-->ligengocp:9,对于字段取值单一(如性别字段只有男与女),而经常在性别上做查询,则建立位图索引。
BITMAP INDEX通常用于DSS,如果你的系统是OLTP,DML操作将LOCK整个BITMAP SEGMENT,因此只在DSS下
考虑BITMAP INDEX。 |
|