您的位置:首页 > 数据库 > Oracle

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

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

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

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

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

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

select count(*) from t;
COUNT(*)
1	500
select count(a) from t
COUNT(a)
1	499


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

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

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



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

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

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

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

待续……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: