基于oracle的优化1

各位朋友,我已开通微信公共号:小程在线

我会把文章及时的更新到公共号上,欢迎大家的关注。

版位是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语句。

发布了89 篇原创文章 · 获赞 109 · 访问量 37万+

猜你喜欢

转载自blog.csdn.net/c1z2w3456789/article/details/84401802
今日推荐