关于一些常见的Oracle性能谣言/讹传
2015-03-11 10:46
246 查看
最近看《基于案例学SQL优化》,觉得讲得不错,把一些东西记录下来,所以这文章算是“转载”类型。
1. 谣言一:count(*) 和 count(列) 效率后者高于前者。
坊间流传的说法是后者能使用索引,因此快。
首先,在某种情况下,这两种写法不具有可比性。
为何这么说呢,假设一个表 t 中有500行,列a有一个null值,那么
两个写法得到的结果都不一样,怎么比?
其次,如果这个列是个索引并且not null列,那么在这种可比的情况下,这两种写法,count(*)效率要高于count(列)
下图是建立一个25列的表,往里面插入1万行数据,并且通过count(*)、count(n1)、count(n2)……等方式分别执行1000遍得到如下图示:
结论:列的偏移量决定性能,列越靠后,访问的开销越大。由于count(*)的算法与列偏移量无关,所以count(*)最快。
这是Oracle优化器的处理方式。
2. 谣言二:in与exists后者效率高。
3. 谣言三:表连接的时候,小表在后,大表在前;where condition的时候,索引要写后面,小表要写后面。
待续……
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的时候,索引要写后面,小表要写后面。
待续……
相关文章推荐
- 用好lua+unity,让性能飞起来——关于《Unity项目常见Lua解决方案性能比较》的一些补充
- .NET中一些常见代码的性能问题
- .NET中一些常见代码的性能问题
- 处理Clob数据(转)关于oracle中大对象处理的一些方法和实例
- 访问 Oracle 数据库的 JDBC 中的一些最常见的错误
- 关于Oracle Shared Server及一些参数设置
- 关于OleDB\Oracle\SQLClient连接数据库的性能测试
- .NET中一些常见代码的性能问题
- [转]SQL Server一些常见性能问题的总结
- SQL SERVER中一些常见性能问题的总结
- Sql server一些常见性能问题的总结
- SQL SERVER中一些常见性能问题的总结
- 关于Oracle Metalink的常见问题
- SQL SERVER中一些常见性能问题的总结[转]
- 关于fso( FileSystemObject )的一些常见问题
- SQL SERVER中一些常见性能问题的总结[转]
- 今天你AJAX了没有?——关于AJAX应用所解决的一些常见问题
- SQL SERVER中一些常见性能问题的总结
- 个人需要,收集了一些关于Oracle 10g OCP认证的资料,与大家分享
- Sql server一些常见性能问题的总结