查询优化

一、SQL语句优化:

1: exists 快于in

2: 数据量小时连接查询快于子查询,数据量大时子查询快于连接查询

3: select (*) 快于 select count(col)

4: 连接查询快于from多个表查询

如果查询结果来源于多个表中则用连接查询,如果最后结果来源于一个中则推荐用子查询

二、in可以分为三类: 

1、形如select  *  from  t1  where  f1  in  ('a','b'),应该和select  *  from  t1  where  f1  ='a'  or  f1='b'  或者  select  *  from  t1  where  f1  ='a'  union  all  select  *  from  t1  f1='b'比较效率,搂主可能指的不是这一类,这里不做讨论。 

2、形如select  *  from  t1  where  f1  in  (select  f1  from  t2  where  t2.fx='x'),其中子查询的where 里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。 

3、形如select  *  from  t1  where  f1  in  (select  f1  from  t2  where  t2.fx=t1.fx),其中子查询的where 里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists。 

除了第一类in语句都是可以转化成exists  语句的,一般编程习惯应该是用exists而不用in. 

三、如A,B两个表, 

当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快: 

select  *  from  A  where  id  in  (select  id  from  B) 

当只显示一个表的数据如A,关系条件不只一个如ID,col1时,使用IN就不方便了,可以使用EXISTS: 

select  *  from  A  where  exists  (select  1  from  B  where  id  =  A.id  and  col1  =  A.col1) 

当只显示两个表的数据时,使用IN,EXISTS都不合适,要使用连接: 

select  *  from  A  left  join  B  on  id  =  A.id   

所以使用何种方式,要根据要求来定。

 

select * from tba left join tbb on tba .id=tbb.id and  tbb.name = 'aaa'
select * from tba left join tbb on tba .id=tbb.id where tbb.name = 'aaa'

 

on 后的条件是连接的时候 过滤之用
由于是left join ,所以在on后面写第一个表的过滤条件都是没有用的

 

结果仍然存在不一致的可能的
跟实验数据有关(试验)

 

如果不是正式数据

你先执行: delete from tbb ;

然后再比较一下结果就可以看出来了

结果会是:

select * from tba left join tbb on tba .id=tbb.id and  tbb.name = 'aaa'
--返回tba所有记录

select * from tba left join tbb on tba .id=tbb.id where tbb.name = 'aaa'
-- 没有任何记录返回

 

on 和where
几乎不可能写出一致的来
2种写法就是2种逻辑

 

基本上not in 的写法都能用 A left join B on A.id=B.id where B.id is null 来取代
建立id索引后,效率有的时候能提升千百倍以上

 

//======

别名不可用在where group 中 可以用在order 中 这里的别名特指字段的别名

rownum只能是小于 不能是大于

====

 select
         *
     from
         ( select
             row_.*,
             rownum rownum_
         from
             ( select
                 czy0_.czgh as czgh21_,
                 czy0_.CHARGE_BZ as CHARGE2_21_,
                 czy0_.czmm as czmm21_,
                 czy0_.czqx as czqx21_,
                 czy0_.ksbm as ksbm21_,
                 czy0_.KSBM_JC as KSBM6_21_,
                 czy0_.srf as srf21_,
                 czy0_.xm as xm21_,
                 czy0_.yfbh as yfbh21_,
                 czy0_.ysbh as ysbh21_
             from
                 Czy czy0_ ) row_
         where
             rownum <= 10
         )
     where
         rownum_ > 5

你可能感兴趣的:(sql,编程)