索引的不足

1.索引开销

a.访问开销

  反问集中导致热块的竞争(对最新数据的查询)

  回表性能取决聚合因子

  索引的访问开销,返回几条数据快,但是返回大量的数据很慢

  全表扫描与全扫描

  建索引会产生全表锁





b.更新开销

 索引本身是有序的,更新索引需要重新排序

c.建立开销

  建索引会产生大量的排序,索引会产生锁





2.索引使用

a.逻辑失效

  类型转换,列运算 upper(列)

  /*

  结论:又是一次move table 引发的血案。

  这次案例,是涉及有主外键的两表关联查询的性能,索引失效导致NL连接性能下降。

  关于用NL连接的时候一般什么最快,具体的知识将在后续的表连接课程中描述。





drop table t_p cascade constraints purge;

drop table t_c cascade constraints purge;





CREATE TABLE T_P (ID NUMBER, NAME VARCHAR2(30));

ALTER TABLE T_P ADD CONSTRAINT  T_P_ID_PK  PRIMARY KEY (ID);

CREATE TABLE T_C (ID NUMBER, FID NUMBER, NAME VARCHAR2(30));





ALTER TABLE T_C ADD CONSTRAINT FK_T_C FOREIGN KEY (FID) REFERENCES T_P (ID);





INSERT INTO T_P SELECT ROWNUM, TABLE_NAME FROM ALL_TABLES;

INSERT INTO T_C SELECT ROWNUM, MOD(ROWNUM, 1000) + 1, OBJECT_NAME  FROM ALL_OBJECTS;

COMMIT;





CREATE INDEX IND_T_C_FID ON T_C (FID);





SELECT TABLE_NAME,INDEX_NAME,STATUS FROM USER_INDEXES WHERE INDEX_NAME='IND_T_C_FID';

TABLE_NAME                     INDEX_NAME                     STATUS

------------------------------ ------------------------------ -------

T_C                            IND_T_C_FID                    VALID





--不小心失效了,比如操作了

ALTER TABLE T_C MOVE;





SELECT TABLE_NAME,INDEX_NAME,STATUS FROM USER_INDEXES WHERE INDEX_NAME='IND_T_C_FID';

TABLE_NAME                     INDEX_NAME                     STATUS

------------------------------ ------------------------------ --------

T_C                            IND_T_C_FID                    UNUSABLE





--结果查询性能是这样的:

SET LINESIZE 1000

SET AUTOTRACE TRACEONLY

SELECT A.ID, A.NAME, B.NAME FROM T_P A, T_C B WHERE A.ID = B.FID AND A.ID = 880;

执行计划

------------------------------------------------------------------------------------------

| Id  | Operation                    | Name      | Rows  | Bytes | Cost (%CPU)| Time     |

------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT             |           |    25 |  1500 |   111   (1)| 00:00:02 |

|   1 |  NESTED LOOPS                |           |    25 |  1500 |   111   (1)| 00:00:02 |

|   2 |   TABLE ACCESS BY INDEX ROWID| T_P       |     1 |    30 |     0   (0)| 00:00:01 |

|*  3 |    INDEX UNIQUE SCAN         | T_P_ID_PK |     1 |       |     0   (0)| 00:00:01 |

|*  4 |   TABLE ACCESS FULL          | T_C       |    25 |   750 |   111   (1)| 00:00:02 |

------------------------------------------------------------------------------------------

   3 - access("A"."ID"=880)

   4 - filter("B"."FID"=880)

统计信息

----------------------------------------------------------

          0  recursive calls

          0  db block gets

        394  consistent gets

          0  physical reads

          0  redo size

       3602  bytes sent via SQL*Net to client

        459  bytes received via SQL*Net from client

          6  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         72  rows processed   

         

---将失效索引重建后

ALTER INDEX IND_T_C_FID   REBUILD;

查询性能是这样的:

SELECT A.ID, A.NAME, B.NAME FROM T_P A, T_C B WHERE A.ID = B.FID AND A.ID = 880;

执行计划

--------------------------------------------------------------------------------------------

| Id  | Operation                    | Name        | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT             |             |    72 |  4320 |    87   (0)| 00:00:02 |

|   1 |  NESTED LOOPS                |             |    72 |  4320 |    87   (0)| 00:00:02 |

|   2 |   TABLE ACCESS BY INDEX ROWID| T_P         |     1 |    30 |     0   (0)| 00:00:01 |

|*  3 |    INDEX UNIQUE SCAN         | T_P_ID_PK   |     1 |       |     0   (0)| 00:00:01 |

|   4 |   TABLE ACCESS BY INDEX ROWID| T_C         |    72 |  2160 |    87   (0)| 00:00:02 |

|*  5 |    INDEX RANGE SCAN          | IND_T_C_FID |    72 |       |     1   (0)| 00:00:01 |

--------------------------------------------------------------------------------------------

   3 - access("A"."ID"=880)

   5 - access("B"."FID"=880)

统计信息

----------------------------------------------------------

          0  recursive calls

          0  db block gets

         81  consistent gets

          0  physical reads

          0  redo size

       3602  bytes sent via SQL*Net to client

        459  bytes received via SQL*Net from client

          6  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         72  rows processed      

b.物理失效

  索引坏了,分区导致全局索引失效,误删除

版权声明:本文为博主原创文章,未经博主允许不得转载。

Oracle性能优化5-索引的不足的更多相关文章

  1. 【转载】我眼中的Oracle性能优化

    我眼中的Oracle性能优化 大家对于一个业务系统的运行关心有如下几个方面:功能性.稳定性.效率.安全性.而一个系统的性能有包含了网络性能.应用性能.中间件性能.数据库性能等等. 今天从数据库性能的角 ...

  2. 降低磁盘IO使Oracle性能优化(转)

    文章转自:http://blog.chinaunix.net/uid-26813519-id-3207996.html 硬件方面虽然只占Oracle性能优化的一个方面(另一方面是软件),但是仍不可忽视 ...

  3. MySQL 数据库性能优化之索引优化

    接着上一篇 MySQL 数据库性能优化之表结构,这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引 ...

  4. 我眼中的 Oracle 性能优化

    恒生技术之眼 作者 林景忠 大家对于一个业务系统的运行关心有如下几个方面:功能性.稳定性.效率.安全性.而一个系统的性能有包含了网络性能.应用性能.中间件性能.数据库性能等等. 今天从数据库性能的角度 ...

  5. oracle性能优化之awr分析

    oracle性能优化之awr分析 作者:bingjava 最近某证券公司系统在业务期间系统运行缓慢,初步排查怀疑是数据库存在性能问题,因此导出了oracle的awr报告进行分析,在此进行记录. 导致系 ...

  6. Oracle性能优化1-总体思路和误区

    最近在看梁敬彬老师关于Oracle性能优化的一些案例,在这里做一些简单的总结 1.COUNT(*)与COUNT(列)哪个更快 drop table t purge; create table t as ...

  7. Oracle性能优化小结

    Oracle性能优化小结 原则一.注意where子句中的连接顺序 Oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须卸载其他where条件之前,哪些可以滤掉最大数量记录的 ...

  8. MySQL性能优化:索引

    MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...

  9. SQL Server数据库性能优化之索引篇【转】

    http://www.blogjava.net/allen-zhe/archive/2010/07/23/326966.html 性能优化之索引篇 近期项目需要, 做了一段时间的SQL Server性 ...

  10. SQL Server查询性能优化——覆盖索引(二)

    在SQL Server 查询性能优化——覆盖索引(一)中讲了覆盖索引的一些理论. 本文将具体讲一下使用不同索引对查询性能的影响. 下面通过实例,来查看不同的索引结构,如聚集索引.非聚集索引.组合索引等 ...

随机推荐

  1. 漫谈C指针:参数传递的三道题目

    漫谈C指针:参数传递的三道题目 2009-07-02 开讲之前,我先请你做三道题目.(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下: [c] view plaincopy ...

  2. 【转】WinDbg调试器:启动程序时自动连接调试器方法

    当我们调试服务进程或子进程时,无法直接用调试加载进程的方式启动,此时需要在启动程序时自动连接调试器方法: 第一步:注册表展开到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft ...

  3. 18.struts-执行流程.md

    目录 1.流程 2.bean节点 3.package节点 result-type 拦截器 概念 拦截器和过滤器的异同: 问题:拦截器什么时候执行,action类和拦截器的执行顺序 4.常见问题 1.流 ...

  4. 16.3 authguard 通过routing path控制显示URL 通过ngif显示和隐藏

    显示或者隐藏component 通常情况下 我们的做法是把它做成class 以上两步完成,我们就可以用service了,再此之前,我们先 这样弄完以后 . 非登录状态键入上面地址会自动返回下面的地址 ...

  5. C# 如何获取鼠标在屏幕上的位置,不论程序是否为活动状态

    一开始我认为应该使用HOOK来写,而且必须使用全局HOOK,结果在一次偶然的机会得到,原来其实根本没有那个必要. 直接上代码吧,一看就明白 Point ms = Control.MousePositi ...

  6. windows7 IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET

    IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET windows7,部署在本地的IIS7里以后,结果不能访问承载SL的.aspx页面,而如果用.html承载则可以访问. 亲测可用修复办法 ...

  7. Canvas中 drawImage绘制图片不显示

    在学习 html5中的 Canvas.drawImage时写了如下代码: <!doctype html> <html> <head><title>研究& ...

  8. Unity3D架构设计NavMesh寻路

    Unity3D架构设计NavMesh寻路 发表于2013年10月6日由陆泽西 国庆闲来没事把NavMesh巩固一下.以Unity3D引擎为例写一个底层c# NavMesh寻路.因为Unity3D中本身 ...

  9. 吴裕雄 python 机器学习-KNN算法(1)

    import numpy as np import operator as op from os import listdir def classify0(inX, dataSet, labels, ...

  10. php loop循环 拿到键名

    {loop $nianjian['dache'] $key  $v}        $key能拿到键名(微擎系统试过可以)