sql点滴

1. 使用like别忘了escape   like '%/s' escape '/'
2. 使用行表达式查询条件   where a.id = '1' and a.name='user'  可以写成
   where (a.id,a.name)=('1','user')  可能会走索引,速度会快
3. with s1 as
    (select * from table t where t.date=date'201503' order by t.id),
   s2 as
    (select * from table t where t.date=date'201504' order by t.id)
   select * from s1
     union all
   select * from s2;
   可以将数据order by后再拼接。单纯union all 不能带order by
4. 带null值得列不走索引,可以建复合索引
   create index idx_t1 on t1(object_Id,1);
   而不是create index idx_t1 on t1(object_Id);
5. 用函数索引避免全表扫描
   select object_id,object_name from t1 where reverse(object_name)like reverse('%EMP');
   create index idx_fun_t1 on t1(reverse(object_name));
   而不是
    select object_id,object_name from t1 where object_name like '%EMP';
   create index idx_fun_t1 on t1(object_name);
5. 大数据量表先限定条件查询出来,在关联其它表,可避免大量全表扫描。
   用户表user(user_id,user_name)  消费表spending(user_id,消费积分score,日期date)统计8月份消费积分排在前10的数据。
   select u.user_name,s.score from user u,(select s.user_id,sum(s.score) score from spend s where trunc(s.date,'yyyymm')='201408') s where u.user_id = s.user_id group by u.user_id,s.score having count(u.user_id) <=10
6.char是定长的,varchar2是变长的,同样定义一列,如果是用char(10),则存储'0'会占用10个byte;如果是用varchar2(10),则存储'0'只会占用1个byte,varchar2更省存储。
  SQL> create table t1(c1 char(10),c2 varchar2(10));
      Table created
  SQL> insert into t1 values('0','0');
      1 row inserted
  SQL> commit;
      Commit complete
  SQL> select lengthb(c1),lengthb(c2) from t1;
      LENGTHB(C1) LENGTHB(C2)
      ———– ———–
         10           1

猜你喜欢

转载自chengyfbj.iteye.com/blog/2192120