为了方便很多人都喜欢用where 1=1 这种常量条件!这样写确实方便了不少,但是对性能到底有多大影响呢?各位请发表一下自己的看法!

解决方案 »

  1.   

    永远为真,提取全部数据,一般写的时候是为了加后续条件的。比如刚刚有个帖子create or replace procedure PROC_HR_ISNEWUSER(vAccountName_in In Varchar2,
                                                  cur_result_out  Out search_result) Is
      str_accountName Varchar2(50);
      str_sql         Varchar2(200);
    Begin
      If vAccountName_in is Not Null Then
        str_accountName := ' and  customercode=''' || vAccountName_in || '''';
      
        str_sql := 'select  customername  from  t_mc_customer  where  1=1' ||
                   str_accountName;
      end if;
      Open cur_result_out For str_sql;end PROC_HR_ISNEWUSER;
      

  2.   

    2.14 书写优化性能建议 避免嵌套连接。例如:A = B AND B = C AND C = D 
    WHERE条件中尽量减少使用常量比较,比如,不要用 1=1。-------------看到的一个文档里面写的!!
      

  3.   

    性能有所降低啦。1=1在数据库里是一种原子公式,它和其它原子公式一样都要占用CPU时间。虽然它是一种常量比较,但一般数据库(我知道的Oracle和Sql Server)都没有识别常量比较的功能。这也就意味着,它和其它公式一样,每条记录都要有可能执行一次判断。
        我曾经用它的情况如下:
    sql="select * from t where 1=1" & state1 & state2;
    其中,state1、state2可以是空,也可以是带有"and"的子判断,用以实现多个查询条件。因为Oracle对where子句采用自下至上的解析方式。所以先判断state2,后判断state1,最后判断"1=1"。这样的话,"1=1"就会在所有符合条件的记录上执行一次。这样的记录越多,性能影响就越大。但CPU执行该判断的时间非常之短,一个机器周期就搞定,而且,现在的机器频率非常之快,我认为,那一点小影响可以忽略不计。 
      

  4.   

    舍得舍得,有舍有得。
    加1=1,一般都出现在动态拼接where条件的需求下。
    此时,与去解析where等关键字相比,加1=1是个很好的主意。
      

  5.   

    where 条件是由下往上执行!
    先按后面的and筛选,也就是说where 1=1 只会执行一次?
      

  6.   

     总结:
     如果是10g以前的,也许需要注意,但是10g及其以后版本中,常量表达式在SQL引擎中解析的时候,已经被过滤掉了。
     oracle遇到诸如1=1之类的,会通过计算自动忽略掉  ,而不会放到每条记录中作为过滤条件。 
     oracle已经变得聪明了。
     当然如果可以不用,还是不要用,虽然解析的时间可以忽略不计,但也需要消耗那么一点点。 
      

  7.   


    9i之前的版本 有些地方经常需要用的功能,就不能用where 1=1 了!
    毕竟还是会有些影响的!谢谢!
      

  8.   

    据说9i以前的版本,在执行sql时,oracle会事先编译sql,就会把类似1=1的条件直接去掉;
      

  9.   


    通常动态 sql 语句中, 为了以 “, x=y ”方式用循环的方法拼接判断条件,会在开头加一个 1=1,以简化程序。
      

  10.   

    影响不大,为了方便添加后续的and ....等条件