关于一些常见的Oracle性能谣言/讹传

来源:互联网 发布:arp表和mac表和vlan 编辑:程序博客网 时间:2024/06/05 03:01


最近看《基于案例学SQL优化》,觉得讲得不错,把一些东西记录下来,所以这文章算是“转载”类型。


1. 谣言一:count(*) 和 count(列) 效率后者高于前者。

坊间流传的说法是后者能使用索引,因此快。

  • 首先,在某种情况下,这两种写法不具有可比性。

为何这么说呢,假设一个表 t 中有500行,列a有一个null值,那么

select count(*) from t;   COUNT(*)1500select count(a) from t   COUNT(a)1499

两个写法得到的结果都不一样,怎么比?

  • 其次,如果这个列是个索引并且not null列,那么在这种可比的情况下,这两种写法,count(*)效率要高于count(列)

下图是建立一个25列的表,往里面插入1万行数据,并且通过count(*)、count(n1)、count(n2)……等方式分别执行1000遍得到如下图示:

结论:列的偏移量决定性能,列越靠后,访问的开销越大。由于count(*)的算法与列偏移量无关,所以count(*)最快。

这是Oracle优化器的处理方式。


2. 谣言二:in与exists后者效率高。

3. 谣言三:表连接的时候,小表在后,大表在前;where condition的时候,索引要写后面,小表要写后面。

待续……

0 0