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更低

相关推荐
点云SLAM8 小时前
BOOS库中Graph模块boost::edge_reverse_t和boost::vertex_color_t解读
数据库·edge·图论·bfs·dfs/拓扑排序·boost库、
尽兴-8 小时前
《深入剖析:全面理解 MySQL 的架构设计》
数据库·mysql·数据库架构设计·理解mysql架构
在风中的意志8 小时前
[数据库SQL] [leetcode] 2388. 将表中的空值更改为前一个值
数据库·sql·leetcode
梦幻通灵8 小时前
Mysql字段判空实用技巧
android·数据库·mysql
酸菜牛肉汤面10 小时前
23、varchar与char的区别
数据库
AI题库10 小时前
PostgreSQL 18 从新手到大师:实战指南 - 2.5 Serverless PostgreSQL
数据库·postgresql·serverless
IT技术分享社区10 小时前
数据库实战:MySQL多表更新JOIN操作的底层原理与性能调优指南
数据库·mysql·程序员
廋到被风吹走10 小时前
【数据库】【Oracle】分区表与大表设计
数据库·oracle
UrSpecial11 小时前
InnoDB存储引擎
数据库·mysql
gjc59211 小时前
MySQL隐蔽 BUG:组合条件查询无故返回空集?深度排查与规避方案
android·数据库·mysql·bug