oracle 笔记 (一)

1,表和字段要有注释,这样方便后期的维护。

 

2,组合索引要把选择性好的列(重复值少的列)放在第一位,而且要在where后面要使用前导列(第一列),否则索引不会被使用;

 

3,把<>操作改成 > or < 操作 (  <> 操作不会走索引  )。

 

比如:把 colum <> 10 可以改成 colum > 10 OR colum < 10

 

4,where 条件后面做比较的字段类型一定要匹配。如果不匹配要在结果集少的字段上做转换 。

 

5, 如果有使用变量的,一定要把变量的类型转换成和字段类型一致。

 

6,不在要where 后面写类似 1=1 的条件。

 

7,使用 not  in 的时候一定要关注一下子查询中是否含有null值的情况,如果含有null值,主查询不会返回任何结果,这种情况可以使用not exists替换。

 

8,注意下面两个语句的区别

 

select * fromlixuejun_test t where rownum <=10 order by t.t3 ;--先取出10条记录,然后对这10条件记录再进行排序

 

select *

     from (select *from lixuejun_test t  order by t.t3)

    where rownum <=10;  --先排序,然后取出t3字段值最小的10条记录。

 

9,关于多表连接去重,要先单个表去重之后再和其它表连接。这样结果集变小了,性能上会更好一些,同时也可以避免笛卡尔积的出现。

 

 

10,如果用到两个字段相除的,要注意做除数的字段为0或null值的情况,

如下面语句要注意t2字段为0和null值的情况

 

select * fromtest t where t.t1/t.t2 < 1 


 今天给大家分享一下生产库上两个异常SQL等价修改的案例。具体修改请见附件。

 

原SQL(生产库正在使用的SQL)主要的问题是本来简单的sql语句能达到的目的,使用了太多没有必要的子查询,使用过程复杂化了。最近做SQLREVIEW  这种类似的问题也遇见很多,请大家注意下。

 

因为调整的是select 语句,所以也在生产库上初步做了一下性能的测试。 结果改之前和改之后的SQL都能在1秒之内运行完,所以性能提高的也不是很明显。由此也推测生产库报这两个sql异常可能是当时的数据库压力比较大,资源不足,再加上这两个sql本身也是有问题的,导致这两个sql运行时间过长。

 

关于修改后的sql在功能上我初步测试也是一样的。请大家有时间也仔细分析下为什么这么改,这样就可以发现原SQL的问题,对自己也有一个提高。

 

有什么疑问也欢迎提出,发现修改之后的SQL与原SQL有不等价的地方更好,我们可以一起再做调整,共同进步!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值