永远为真,提取全部数据,一般写的时候是为了加后续条件的。比如刚刚有个帖子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.14 书写优化性能建议 避免嵌套连接。例如:A = B AND B = C AND C = D WHERE条件中尽量减少使用常量比较,比如,不要用 1=1。-------------看到的一个文档里面写的!!
性能有所降低啦。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执行该判断的时间非常之短,一个机器周期就搞定,而且,现在的机器频率非常之快,我认为,那一点小影响可以忽略不计。
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;
WHERE条件中尽量减少使用常量比较,比如,不要用 1=1。-------------看到的一个文档里面写的!!
我曾经用它的情况如下:
sql="select * from t where 1=1" & state1 & state2;
其中,state1、state2可以是空,也可以是带有"and"的子判断,用以实现多个查询条件。因为Oracle对where子句采用自下至上的解析方式。所以先判断state2,后判断state1,最后判断"1=1"。这样的话,"1=1"就会在所有符合条件的记录上执行一次。这样的记录越多,性能影响就越大。但CPU执行该判断的时间非常之短,一个机器周期就搞定,而且,现在的机器频率非常之快,我认为,那一点小影响可以忽略不计。
加1=1,一般都出现在动态拼接where条件的需求下。
此时,与去解析where等关键字相比,加1=1是个很好的主意。
先按后面的and筛选,也就是说where 1=1 只会执行一次?
如果是10g以前的,也许需要注意,但是10g及其以后版本中,常量表达式在SQL引擎中解析的时候,已经被过滤掉了。
oracle遇到诸如1=1之类的,会通过计算自动忽略掉 ,而不会放到每条记录中作为过滤条件。
oracle已经变得聪明了。
当然如果可以不用,还是不要用,虽然解析的时间可以忽略不计,但也需要消耗那么一点点。
9i之前的版本 有些地方经常需要用的功能,就不能用where 1=1 了!
毕竟还是会有些影响的!谢谢!
通常动态 sql 语句中, 为了以 “, x=y ”方式用循环的方法拼接判断条件,会在开头加一个 1=1,以简化程序。