已建索引执行计划为何不走索引?

简介: DROP INDEX scott.IDX_UNI_EMP; CREATE INDEX scott.IDX_EMP_1 ON scott.EMPLOYEE (EMPLOYEE_ID); -- SELECT* FROMscott.EMPLOYEE WHEREEMPLOYEE_ID = 100; SELECT* FROMTABLE (DBMS_XPLAN.DISPLAY_CURSO
DROP INDEX scott.IDX_UNI_EMP;


CREATE INDEX scott.IDX_EMP_1 ON scott.EMPLOYEE (EMPLOYEE_ID);


--
SELECT
*
FROM
scott.EMPLOYEE
WHERE
EMPLOYEE_ID = 100;


SELECT
*
FROM
TABLE (
DBMS_XPLAN.DISPLAY_CURSOR (NULL, NULL, 'ADVANCED')
);


--
TRUNCATE TABLE scott.EMPLOYEE;


BEGIN
FOR I IN 1 .. 5000 LOOP 
INSERT INTO scott.EMPLOYEE
VALUES
('F', I) ;
END LOOP ; 
COMMIT ;
END ;
/


BEGIN
FOR I IN 5001 .. 10000 LOOP 
INSERT INTO scott.EMPLOYEE
VALUES
('M', I) ;
END LOOP ; 
COMMIT ;
END ;
/


--
SELECT
GENDER,
COUNT (*)
FROM
scott.EMPLOYEE
GROUP BY
GENDER;


EXEC DBMS_STATS .GATHER_TABLE_STATS(ownname=>'scott',tabname=>'EMPLOYEE',estimate_percent=>100,CASCADE=>TRUE,method_opt=>'for all columns size 1',no_invalidate=>FALSE);


SET AUTOT TRACE 


--
SELECT
EMPLOYEE_ID
FROM
scott.EMPLOYEE;

--强制也不走
SELECT
/*+ INDEX(EMPLOYEE IDX_EMP_1) */
EMPLOYEE_ID
FROM

scott.EMPLOYEE;


为什么?

 索引IDX_EMP_1是个单键值B树索引,因此null值不会存储其中,但是一旦EMPLOYEE_ID有了null(尽管此实验没有null),此索引会跳过null,导致执行结果不对,执行计划就有可能不会走,因此选择走全表扫描


处理办法:ALTER TABLE scott.EMPLOYEE MODIFY (EMPLOYEE_ID NOT NULL);






目录
相关文章
|
3月前
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
|
8月前
|
SQL 关系型数据库 MySQL
关于索引的使用
关于索引的使用
|
存储 关系型数据库 MySQL
了解和认识索引
了解和认识索引 。
69 0
|
8月前
|
安全 关系型数据库 MySQL
合理使用索引
【5月更文挑战第9天】这篇文章探讨了数据库索引的高效使用,包括函数和表达式索引、查找和删除未使用的索引、安全删除索引、多列索引策略、部分索引以及针对通配符搜索、排序、散列和降序索引的特殊技巧。还介绍了部分索引在减少索引大小和处理唯一性约束中的应用,以及PostgreSQL对前导通配符搜索的支持。通过遵循简单的多列索引规则和利用特定类型的索引,如哈希和降序索引,可以显著提高查询性能。
114 0
|
8月前
|
存储 算法 关系型数据库
索引总结(2)
索引总结(2)
55 0
|
索引
索引下推
大家多多 关注
156 0
|
数据库 索引
请注意这些情况下,你的索引会不生效!
数据库性能优化是确保系统高效运行的关键要素之一。而索引作为提升数据库查询性能的重要工具,在大部分情况下都能发挥显著的作用。然而,在某些情况下,索引可能会失效或不起作用,导致查询性能下降,甚至引发性能瓶颈。
|
存储 关系型数据库 MySQL
索引及查询优化
索引及查询优化
70 0
|
NoSQL MongoDB 开发者
索引的使用 执行计划 | 学习笔记
快速学习 索引的使用 执行计划
索引的使用 执行计划 | 学习笔记
|
SQL 数据库 索引
为or、in平反——or、in到底能不能利用索引?
  先说一个笑话,作为开场白。俺也换换风格试一试,呵呵。   在以前,有三个书生赶考,在路上遇到了一个算命先生,于是就问算命先生:我们三个人赶考,结果如何呀?算命先生伸出来了一个手指头(食指)。
1056 0