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

简介: 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);






目录
相关文章
|
2月前
|
索引
索引
索引。
20 0
|
2月前
|
存储 关系型数据库 MySQL
了解和认识索引
了解和认识索引 。
16 0
|
2月前
|
存储 SQL 关系型数据库
索引
索引(在MySQL中也叫做“键(key)”)是存储引擎用于快速找到记录的一种数据结构。 索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降。如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找。
12 0
|
2月前
|
关系型数据库 MySQL 索引
索引(2)
索引(2)。
9 0
|
2月前
|
关系型数据库 MySQL 数据库
了解和认识索引
了解和认识索引。
12 0
|
7月前
|
存储 关系型数据库 MySQL
索引及查询优化
索引及查询优化
40 0
|
NoSQL MongoDB 开发者
索引的使用 执行计划 | 学习笔记
快速学习 索引的使用 执行计划
35 0
索引的使用 执行计划 | 学习笔记
|
存储 缓存 自然语言处理
正排索引
介绍ElasticSearch相关正排索引
|
监控 关系型数据库 C#