暂无图片
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
打赏 0
薛晓刚

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

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

暂无图片 评论
暂无图片 有用 0
打赏 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
打赏 0
老虎刘

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

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
oracle 等待事件Data file init write
回答 1
等待事件"Datafileinitwrite"表示正在等待数据文件初始化写入完成。当数据库扩展数据文件时,可能需要进行一些初始化工作,这包括在文件中预分配一些空间,以便在将来的写入操作中使用。这通常是
awr显示的内存与sga_target不一样
回答 2
具体个怎么不一样法
Oracle存储过程怎么能将变量粘到建表的表名上?
回答 2
可能是说的拼接动态sql建表吧?declareptabnamevarchar2(200);beginptabname:'testtab1';executeimmediate'createtable'|
tnsping 响应时间达到2s有些慢
回答 5
已采纳
有人说可以,把日志删除,会好点,但解决不了问题。300811/export/home/oracle/script/clearLsnLog.sh&gt;/dev/null2&gt;&amp;1oracl
Oracle ,V$SQL_CS_SELECTIVITY里面,同range下的每一个predicate应该对应一个bind,为什么有的sql会有重复的行,并且low-high一样?
回答 2
同问,我也碰到了这个问题。
oracle11g单节点asm升级grid补丁失败问题
回答 3
已采纳
提示你oraclerdbmshome下的opatch版本失败啦。grid补丁应该自带gridrdbms的补丁,使用rootauto不指定oh的话,会自动将本节点的grid跟rdbms都进行校验,所以你
xtts迁移数据库增量过程失败
回答 1
参考下这篇文件:http://blog.itpub.net/28389881/viewspace2629881/建议使用rmanxttconvertVER4.zip进行迁移。
oracle 一个表和一个视图联合更新,表的索引字段和视图的对应字段类型一样,但是最大长度不一样,索引还有效果吗?
回答 1
已采纳
类型一致就行。看执行计划就行。前提是要有有效的where条件就行。
Oracle中经常delete的系统,如何处理?
回答 2
已采纳
经常delete的表会造成大量的碎片影响性能。一般会进行表空间碎片整理,或者大表碎片整理。
ORACLE中的db_name,service_names,instance_name,oracle_sid,global_dbname对应关系
回答 1
已采纳
个人感觉,不同场景使用不同的名字。dbname,搭建DG时,备库的dbname要与主库一致,dbuniquename需要不同于主库;instancename,psef|grepismon看到的名称;O