各位朋友,我已开通微信公共号:小程在线
我会把文章及时的更新到公共号上,欢迎大家的关注。
版位是oracle 11G。
1.误区说明:
1.1 关于count()的错误理解。
count(*):只要某一行的数据存在一个数据,就会统计出来。
count(列): 只统计该列数据不为空的数据。
count(*)和count(列) 是不等价的。
count(第几列),列数越往后,运行时间就会越久;count(*)不会出行这种情况。
1.2 关于表的连接顺序误区
CREATE TABLE big_table AS
SELECT * FROM t WHERE rownum<30000;
CREATE TABLE small_table AS
SELECT * FROM t WHERE rownum<3;
第一条大表在前,小表在后。第二条小表在前,大表在后。
第一条0.034秒,第二条0.15秒。显然上一条性能好于下一条
结论:那是基于规则的时代,现在我们是基于代价的。
1.3 in 和 exists之争
结论:11g与空值有关,都可以用到anti的半连接算法,执行计划一样,性能一样。
无论是not in还是 not exists,无论列是否为空,oracle都会走anti反连接。
2. 体验分区带来的SQL性能提升
第二个表是分区表,第一个表的花费是1607,第二个的花费是2。差距相当明显。
3.避免函数调用。
4.减少 * 的使用,取所需的列。
5.当有大量重复SQL,只有条件不同,尝试case when语法。
6.当频繁使用一个表时,可以考虑使用with语句。