匿名用户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

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回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
墨值悬赏


