首页 > 数据库 > Oracle > 博文第100篇---让索引记录空值
昨天下午时发现监控告警,数据库的磁盘使用率100%,用以下sql语句查看数据库正在执行的sql:
select to_char(sql_fulltext),
v$sqlarea.sql_id,
last_call_et continue_time,
logon_time,
v$process.spid,
sid,
v$session.serial#,
v$sqlarea.hash_value,
v$sqlarea.plan_hash_value,
v$session.username,
LOCKWAIT,
machine
from v$session, v$process, v$sqlarea
where paddr = addr
and sql_hash_value = hash_value
and status = 'ACTIVE'
and v$session.username is not null
order by last_call_et desc;
发现很有同一个sql_id的sql正在执行,而且时间都已经超过100s,sql如下:
SELECT t1.*
FROM t1
WHERE (t1.PROC_PLAN_ID IS NULL)
AND (t1.SEQ_ID IS NULL)
查看T1表为2.5G,执行计划是全表扫描。咨询了开发人员,他们说缺少where条件,在他们查找程序的过程中,我再T1表上创建了一个索引。正常情况下,索引是不记录空值的,但如果创建组合索引,那执行计划就会使用该索引。
create index pppli_null on T1(PROC_PLAN_ID,SEQ_ID,0);
再次查看执行计划发现已经走了索引,执行时间约为0.1s。此时磁盘使用率也下降为20%。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24500180/viewspace-1073691/ ,如需转载,请注明出处,否则将追究法律责任。