• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    INEXISTS与NOT INNOT EXISTS 的优化原则小结
    1. EXISTS的执行流程
    select * from t1 where exists ( select null from t2 where y = x )
    可以理解为:
    复制代码 代码如下:

    for x in ( select * from t1 )
    loop
    if ( exists ( select null from t2 where y = x.x )
    then
    OUTPUT THE RECORD
    end if
    end loop

    对于in 和 exists的性能区别:
    如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
    其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了
    另外IN时不对NULL进行处理,如:
    select 1 from dual where null in (0,1,2,null)
    结果为空。

    2. NOT IN 与NOT EXISTS:
    NOT EXISTS的执行流程
    复制代码 代码如下:

    select .....
    from rollup R
    where not exists ( select 'Found' from title T
    where R.source_id = T.Title_ID);

    可以理解为:
    复制代码 代码如下:

    for x in ( select * from rollup )
    loop
    if ( not exists ( that query ) ) then
    OUTPUT
    end if;
    end;

    注意:NOT EXISTS 与 NOT IN 不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。
    例如下面语句,看他们的区别:
    select x,y from t;
    x y
    ------ ------
    1 3
    3 1
    1 2
    1 1
    3 1
    5
    select * from t where x not in (select y from t t2 )
    no rows
    select * from t where not exists (select null from t t2
    where t2.y=t.x )
    x y
    ------ ------
    5 NULL
    所以要具体需求来决定
    对于not in 和 not exists的性能区别:
    not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hash join.
    如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null
    NOT IN 在基于成本的应用中较好
    比如:
    复制代码 代码如下:

    select .....
    from rollup R
    where not exists ( select 'Found' from title T
    where R.source_id = T.Title_ID);

    改成(佳)
    select ......
    from title T, rollup R
    where R.source_id = T.Title_id(+)
    and T.Title_id is null;
    或者(佳)
    sql> select /*+ HASH_AJ */ ...
    from rollup R
    where ource_id NOT IN ( select ource_id
    from title T
    where ource_id IS NOT NULL )
    注意:上面只是从理论上提出了一些建议,最好的原则是大家在上面的基础上,能够使用执行计划来分析,得出最佳的语句的写法。
    '//=============================
    exists,not exists总结

    1 exists
    SELECT * FROM anken_m WHERE EXISTS(
    SELECT my_list_temp_m.sales_code
    FROM my_list_temp_m
    WHERE my_list_temp_m.sales_code=anken_m.sales_code)
    说明:
    1) 查询在anken_m表和my_list_temp_m表中都存在的sales_code。
    2) sales_code是anken_m的主键,my_list_temp_m的外键。
    注意:
    1) 外层查询表anken_m是查询的对象。
    2) 内层查询表my_list_temp_m是条件对象。
    3) 内外层的查询表不能相同。
    4) 作为关联条件的anken_m表不需要在内层查询FROM后添加。
    5) my_list_temp_m.sales_code=anken_m.sales_code条件的左右顺序不影响查询结果。

    2 not exists
    SELECT * FROM anken_m WHERE NOT EXISTS(
    SELECT my_list_temp_m.sales_code
    FROM my_list_temp_m
    WHERE my_list_temp_m.sales_code=anken_m.sales_code)
    说明:
    1) 查询在anken_m表中存在,但是在my_list_temp_m表中不存在的sales_code。
    2) sales_code是anken_m的主键,my_list_temp_m的外键。
    注意:
    1) 外层查询表anken_m是查询的对象。
    2) 内层查询表my_list_temp_m是条件对象。
    3) 内外层的查询表不能相同。
    4) 作为关联条件的anken_m表不需要在内层查询FROM后添加。
    5) my_list_temp_m.sales_code=anken_m.sales_code条件的左右顺序不影响查询结果。

    3 综合运用
    UPDATE anken_m
    SET(plan_type_code, branch_name, business_type_code)
    =(SELECT anken.plan_type_code,anken.branch_name,anken.business_type_code
    FROM anken
    WHERE anken.sales_code=anken_m.sales_code)
    WHERE EXISTS (
    SELECT anken.sales_code
    FROM anken,my_list_temp_m
    WHERE my_list_temp_m.sales_code=anken.sales_code
    AND anken.sales_code=anken_m.sales_code
    )
    说明:
    1) 用一个表的记录数据更新另一个表的记录数据。
    2) 用一个SQL语句进行批量更新。
    2) sales_code是anken,anken_m的主键,my_list_temp_m的外键。
    注意:
    1) set 语句中的要被更新字段必须跟数据源字段一一对应,另外数据源查询中的条件必须限定一条记录。也就是根据sales_code可以唯一确定anken的一条记录,和anken_m的一条记录,这样才能保证要被更新的记录和数据源记录的主键是相同的。
    2) 根据WHERE EXISTS语句可以确定数据源记录的范围,也就是可以用anken表中哪些记录更新anken_m表。所以anken_m不需要在WHERE EXISTS语句中的FROM后添加。
    上一篇:SQLServer中临时表与表变量的区别分析
    下一篇:SQL Server数据库开发的二十一条法则
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    INEXISTS与NOT INNOT EXISTS 的优化原则小结 INEXISTS,与,NOT,INNOT,EXISTS,