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

相关推荐
汽车仪器仪表相关领域几秒前
ZDT-III 通用电机测试系统
数据库·算法·单元测试·压力测试·可用性测试
赵得C8 分钟前
Spring Boot+MyBatis:用 PageHelper 实现 Oracle 12c 的 OFFSET 分页
spring boot·oracle·mybatis
GHL28427109012 分钟前
redis编译调试(linux)
linux·数据库·redis
robinson198813 分钟前
Oracle-PG-崖山全表扫描基础算子性能对比
数据库·oracle·全表扫描·崖山·基础算子性能
九皇叔叔20 分钟前
MySQL 数据库 隔离级别 详解
数据库·mysql
TG:@yunlaoda360 云老大27 分钟前
华为云国际站代理商IoTDA的设备生命周期管理功能如何保障数据安全?
服务器·数据库·华为云
lkbhua莱克瓦2427 分钟前
基础-SQL的通用语法、分类以及DDL
开发语言·数据库·笔记·sql·mysql·ddl
Jack Sparrow丶33 分钟前
Oracle外键查询
数据库·oracle
云老大TG:@yunlaoda36035 分钟前
华为云国际站代理商IoTDA的设备生命周期管理功能有哪些优势?
服务器·数据库·华为云
Warren981 小时前
MySQL 8 中的保留关键字陷阱:当表名“lead”引发 SQL 语法错误
linux·数据库·python·sql·mysql·django·virtualenv