`
luozhonghua2014
  • 浏览: 62330 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
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);






分享到:
评论

相关推荐

    索引和视图的创建和修改

    视图不包含任何实际数据,而只是包含SQL语句,当查询视图时,会执行这些SQL语句以从基础表中获取数据。 - **创建视图**: - 使用企业管理器: - 打开企业管理器,选择相应的数据库。 - 在“对象”菜单中选择...

    oracle、sql数据库批量建索引

    在数据量庞大的情况下,索引的重要性尤为突出。 对于Oracle数据库,批量创建索引可以通过SQL命令或者PL/SQL脚本来实现。例如,你可以使用`CREATE INDEX`语句来创建单个索引,然后通过循环结构批量处理多个索引。...

    MySQL分区字段列有必要再单独建索引吗?

    这是因为MySQL会使用已有的复合索引来执行这些查询,无需额外的索引资源。 在决定是否为分区字段创建单独索引时,应考虑以下因素: 1. 查询模式:分析应用中常见的查询语句,看是否频繁地仅依赖分区字段。 2. 数据...

    sql优化、索引的建立和运用以及多表连接建索引的拙劣见解

    ### SQL优化、索引的建立和运用以及多表连接建索引的相关知识点 #### SQL优化概述 在数据库系统中,SQL语句的执行效率对于系统的响应时间和资源利用有着至关重要的影响。合理的SQL优化不仅可以显著提升查询速度,还...

    [Oracle]如何在亿级记录表中创建索引

    **解释**:通过设置`set timing on`,可以在执行查询后显示执行时间,这对于估算索引创建的时间成本非常有用。 #### 三、创建索引的策略与步骤 基于上述信息,我们可以制定出创建索引的具体策略。 1. **确定索引列...

    Oracle在线建立超大表的索引

    - 减少RD的I/O:虽然很难实现,但可以通过使用`COMPRESS`选项来尝试减少,但由于`parent_customer_no`字段多数为空,实际效果可能不明显。 - 减少RE的I/O:使用`NOLOGGING`子句创建索引,待索引创建完成后,再将其...

    关于oracle clob 类型字段重建索引SQL及修复用户表空间索引空间的存储过程

    首先,重建CLOB类型字段的索引可能是因为索引碎片过多、性能下降或为了更新索引结构以适应新的数据。重建索引通常涉及删除现有索引并重新创建它。以下是一个简单的重建CLOB类型字段索引的SQL语句示例: ```sql ...

    MongoDB数据库索引介绍.pptx

    为什么需要索引?索引可以显著地提高查询性能。例如,在没有索引的情况下,MongoDB 需要扫描整个集合来查找所需的数据,这将导致查询时间变得很长。使用索引可以减少查询时间,使得 MongoDB 可以快速地找到所需的...

    基于Hadoop的分布式索引构建

    在提到的淘宝商品搜索索引构建的案例中,面对数亿商品的海量数据,单机建索引的方式存在明显的缺点,例如索引构建时间长、分发索引时间长和容错能力差等。而采用分布式索引构建的方式则可以解决这些问题。分布式索引...

    oracle中索引的使用

    函数索引允许在列上应用函数后再创建索引,如对日期字段进行年份提取后建索引。唯一索引则确保索引列中的每个值都是唯一的,有助于维护数据的完整性。 创建索引有多种方式,如通过CREATE INDEX语句直接创建,或在...

    Oracle数据库中的索引管理技术.pdf

    为什么要创建索引呢?这是因为,创建合理的索引将可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是索引的最主要的原因。第三,可以加速表...

    lucene实现索引查询

    6. **创建查询器**:`IndexSearcher`执行查询,传入索引读取器和是否开启多线程。 7. **执行查询**:调用`IndexSearcher.search()`方法,返回匹配的文档集合(TopDocs)。 8. **处理查询结果**:TopDocs包含匹配...

    在MYsql里面建索引

    1. **主键索引**:每个表只能有一个主键,它的值必须是唯一的,并且不允许为空。主键索引是自动创建的,用于标识表中的每一行。例如,创建一个名为`students`的表,其中`id`为主键: ```sql CREATE TABLE students...

    ORACLE四招提高位图索引

    其次,为了提高位图索引的性能,应尽可能将要建索引的列设置为固定长度的数据类型,如CHAR,而不是VARCHAR2。固定长度的数据类型在位图索引中能提供更好的性能。尽管可变长度的数据类型能节省存储空间,但考虑到性能...

    sql学习 某SQL建索引调优案例.doc

    在本案例中,我们将对一个SQL语句进行优化,该语句的ID为b1z7kzp1p1hjd,该语句执行时间约为1.6秒,每周执行约200万次,合计产生了400多亿次逻辑读。该语句的执行计划如下: ```sql SELECT DATA_MSG_FILELIST_ID, ...

    oracle海量数据中提升创建索引的速度.docx

    parallel 并行参数可以使创建索引的操作并行执行,从而提高创建索引的速度。在 Oracle 数据库中,可以使用 parallel 参数来并行执行查询操作,包括创建索引的操作。parallel 参数可以根据系统的负载情况自动调整并行...

    Lucene3总体图_建索引_查询_数据库索引

    7. **执行查询**:使用查询对象在索引中查找匹配项。 8. **返回结果**:将查询结果返回给用户。 #### 四、Lucene3建立索引的步骤 1. **创建Directory对象**:指定索引文件的存储位置。 2. **创建IndexWriter对象**...

    oracle分区表分区索引.docx

    Oracle 不会自动维护全局分区索引,当我们在对表的分区做修改之后(如对分区作 move,truncate,drop),如果对分区进行维护操作时不加上 update global indexes,通常会导致全局索引的INVALDED,必须在执行完操作后 ...

    用Lucene.net对数据库建立索引及搜索

    《使用Lucene.NET对数据库建立索引及搜索》 在信息技术领域,搜索引擎是不可或缺的一部分,尤其是在处理大量数据时。Lucene.NET是一个强大的全文搜索引擎库,它允许开发人员在应用程序中集成高级搜索功能。本文将...

Global site tag (gtag.js) - Google Analytics