1、使用<> 或 !=的地方尽量改为< or >
由于不等于会导致全表扫描,改为or使用索引更高效
如:
select * from table t where t.age !=20;
改为:
select * from table t where t.age <20 or t.age>20;
2、使用大于等于(>=)替换大于(>)
如:
select * from table t where t.age>20;
改为
select * from table t where t.age>=21;
注:如果表中有索引,这样会提高查询效率,因为!=、<>、 > 都会导致全表查询比较。
索引查询sql:
select * from user_indexes where table_name=upper('表名');
查询索引的列名
select * from user_ind_columns where index_name in ('IDX_227401_10','IDX_227401_7','IDX_227401_8');
3、oracle语法中和null做判断都会有问题
如:
select * from tsecurity t
正常来说,我想要查询出不为空的数据,应该只有第一条,但是下面这种写法是不对的
错误写法:
select * from tsecurity t where t.remark != null
此时与null做判断应该写成:
select * from tsecurity t where nvl(t.remark,'*') != '*'
或者还有一种case when的方法也行;
综上,与null做比较时处理语句应该有以下两种形式:
a. nvl(字段名,‘ * ’) != ‘ * ’
b. case when 字段名 is null then '*' else 字段名 end != ' * '