已建索引执行计划为何不走索引?
2016-04-17 22:13
429 查看
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);
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);
相关文章推荐
- ArrayList的增 删 改 查
- ubuntu12.04 安装 skyeye 1.2.6 arm-linux-gcc arm-elf-gcc
- 运算符重载
- 快速配置 Samba 将 Linux 目录映射为 Windows 驱动器
- 单链表删除元素
- Office——检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败
- T-SQL 数据库的创建
- ecshop提示Strict Standards: Non-static method cls_image::gd_version()
- 52_保存Activity的状态
- 广度搜索-1013
- jmeter响应数据中文乱码问题
- PEP8 Python 编码规范整理
- Android adb的基本命令
- 南京理工大学第八届程序设计大赛(校外镜像)
- 我想我要做点什么
- 50_Android安全机制
- Java垃圾收集的相关知识
- 单核CPU画正弦曲线
- 南京理工大学第八届程序设计大赛(校外镜像)
- EC修炼之道—按键的做法