oracle:让is null使用索引

一些性能不佳的查询涉及"IS NULL"条件,类似于:

bash 复制代码
 SQL>UPDATE T1 SET id2 = 1 WHERE id2 IS NULL;
 
Execution Plan
----------------------------------------------------------
Plan hash value: 2927627013
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |      |     4 |    52 |    80   (2)| 00:00:01 |
|   1 |  UPDATE            | T1   |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| T1   |     4 |    52 |    80   (2)| 00:00:01 |

Oracle 不会在索引中存储 NULL 值,因此即使 T1.ID2 列上确实存在索引,它也无法使用。

有一个有用的索引技巧可以帮助调整这个语句。 创建一个索引并将常量值添加到索引末尾,以便存储 NULL 值。

bash 复制代码
SQL> create index idx_id2 on t1(id2,1)
SQL>  UPDATE T1 SET id2 = 1 WHERE id2 IS NULL;
99999 rows updated.
Execution Plan
----------------------------------------------------------
Plan hash value: 4068505729

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | UPDATE STATEMENT  |         |     4 |    52 |    33   (0)| 00:00:01 |
|   1 |  UPDATE           | T1      |       |       |            |          |
|*  2 |   INDEX RANGE SCAN| IDX_ID2 |     4 |    52 |    33   (0)| 00:00:01 |
-----------------------------------------------------------------------------

这一次,sql选择走index,并且cost更低

相关推荐
2401_8654396323 分钟前
mysql如何处理升级后的身份认证兼容性_mysql_native_password配置
jvm·数据库·python
lhbian24 分钟前
PHP、C++和C语言对比:哪个更适合你?
android·数据库·spring boot·mysql·kafka
NotFound48624 分钟前
Flask项目目录怎么分_MVC架构在Flask应用中的常见目录树
jvm·数据库·python
小陈phd27 分钟前
电商智能客服智能体——基于LangChain的电商智能客服 Agent 架构设计与实现(二)
数据库·microsoft·langchain
2401_8971905529 分钟前
JavaScript对象浅拷贝:Object-assign的合并规则
jvm·数据库·python
Shorasul33 分钟前
如何用 fill 配合 map 初始化一个填充了不同对象的数组
jvm·数据库·python
weixin_5860614636 分钟前
golang如何使用go-redis客户端_golang go-redis客户端使用教程
jvm·数据库·python
逍遥德1 小时前
Java 锁(线程间)和数据库锁(事务间)对比详解
java·数据库·sql·高并发·锁机制
m0_377618231 小时前
C# 异步范围Asynchronous Disposal方法 C# await using如何使用
jvm·数据库·python
Dream of maid1 小时前
Mysql(9)事务
数据库·mysql