暂无图片
Oracle 当where条件判断一个字段(比如delete_flg这个字段只会有两只值0和1),where条件写=1与!=0效率上有区别吗?
我来答
分享
暂无图片 匿名用户
Oracle 当where条件判断一个字段(比如delete_flg这个字段只会有两只值0和1),where条件写=1与!=0效率上有区别吗?

当where条件判断一个字段(比如delete_flg这个字段只会有两只值0和1),where条件写=1与!=0效率上有区别吗?

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
刘贵宾

有区别。

应尽量避免在 WHERE 子句中使用 != 或 <> 操作符,!=是不会走索引的
ORACLE 只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,in以及符合最左原则的 LIKE

暂无图片 评论
暂无图片 有用 0
薛晓刚

看看数据分布吧。如果各一半,没什么区别都是全表。

如果99%都是一个,那么查另外一个,可能有用。(前提是统计信息和直方图正确)

暂无图片 评论
暂无图片 有用 0
布衣
暂无图片

image.png
image.png

SQL> select * from t1 where DELETE_FLG !=1; ID DELETE_FLG ---------- ---------- 1 0 3 0 Execution Plan ---------------------------------------------------------- Plan hash value: 3617692013 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2 | 10 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| T1 | 2 | 10 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(TO_NUMBER("DELETE_FLG")<>1) Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 650 bytes sent via SQL*Net to client 519 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 2 rows processed SQL> select * from t1 where DELETE_FLG=0; ID DELETE_FLG ---------- ---------- 1 0 3 0 Execution Plan ---------------------------------------------------------- Plan hash value: 3617692013 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2 | 10 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| T1 | 2 | 10 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(TO_NUMBER("DELETE_FLG")=0) Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 650 bytes sent via SQL*Net to client 519 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 2 rows processed

从实验结果来看,两个基本没有什么差距,也可能是数据量少或我的索引建的不合适。
按理论来说:= 会走索引,!= 这种模糊查询不走索引。

希望对你有所参考。

暂无图片 评论
暂无图片 有用 0
老虎刘

建议只要能写成=或in,  就不要写成!= . 不管是否有索引

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏