1.索引的坏处

索引可以加快查询效率,但是使用不当,会造成插入性能很低

drop table test1 purge;

drop table test2 purge;

drop table test3 purge;

drop table t purge;

create table t as select * from dba_objects;

create table test1 as select * from t;

create table test2 as select * from t;

create table test3 as select * from t;

create index idx_owner on test1(owner);

create index idx_object_name on test1(object_name);

create index idx_data_obj_id on test1(data_object_id);

create index idx_created on test1(created);

create index idx_last_ddl_time on test1(last_ddl_time);

create index idx_status on test1(status);

create index idx_t2_sta on test2(status);

create index idx_t2_objid on test2(object_id);

set timing on 

--语句1(test1表有6个索引)

insert into test1 select * from t;

commit;

--语句2(test2表有2个索引)

insert into test2 select * from t;

commit;

--语句3(test3表有无索引)

insert into test3 select * from t;

commit;





一次与出账相关的小故事

drop table t purge;

create table t as select * from dba_objects;

insert into t select * from t;

insert into t select * from t;

commit;

--请从这里开始注意累加的时间(从建索引到插入记录完毕)

set timing on 

create index idx_t_owner on t(owner);

create index idx_t_obj_name on t(object_name);

create index idx_t_data_obj_id on t(data_object_id);

create index idx_t_created on t(created);

create index idx_t_last_ddl on t(last_ddl_time);



--语句1(t表有6个索引)

insert into t select * from t;

commit;

--以下进行试验2

drop table t purge;

create table t as select * from dba_objects;

insert into t select * from t;

insert into t select * from t;

commit;

---也从这里开始这里开始注意累加的时间(从插入记录完毕到建索引完毕)

set timing on 

--语句1(t表有6个索引,此时先不建)

insert into t select * from t;

create index idx_t_owner on t(owner);

create index idx_t_obj_name on t(object_name);

create index idx_t_data_obj_id on t(data_object_id);

create index idx_t_created on t(created);

create index idx_t_last_ddl on t(last_ddl_time);

2索引与排序

set linesize 266

drop table t purge;

create table t as select * from dba_objects;

select t1.name, t1.STATISTIC#, t2.VALUE

  from v$statname t1, v$mystat t2

 where t1.STATISTIC# = t2.STATISTIC#

   and t1.name like '%sort%';



create index idx_object_id on t(object_id);

select t1.name, t1.STATISTIC#, t2.VALUE

  from v$statname t1, v$mystat t2

 where t1.STATISTIC# = t2.STATISTIC#

   and t1.name like '%sort%';

3.分区表使用不当

在分区表中一定要加上分区条件,否则有可能会更慢

drop table part_tab purge;

create table part_tab (id int,col2 int,col3 int)

        partition by range (id)

        (

        partition p1 values less than (10000),

        partition p2 values less than (20000),

        partition p3 values less than (30000),

        partition p4 values less than (40000),

        partition p5 values less than (50000),

        partition p6 values less than (60000),

        partition p7 values less than (70000),

        partition p8 values less than (80000),

        partition p9 values less than (90000),

        partition p10 values less than (100000),

        partition p11 values less than (maxvalue)

        );  

insert into part_tab select rownum,rownum+1,rownum+2 from dual connect by rownum <=110000;

commit;

create  index idx_par_tab_col2 on part_tab(col2) local;

create  index idx_par_tab_col3 on part_tab(col3) ;



drop table norm_tab purge;

create table norm_tab  (id int,col2 int,col3 int);

insert into norm_tab select rownum,rownum+1,rownum+2 from dual connect by rownum <=110000;

commit;

create  index idx_nor_tab_col2 on norm_tab(col2) ;

create  index idx_nor_tab_col3 on norm_tab(col3) ;



set autotrace traceonly statistics

set linesize 1000

set timing on 

select * from part_tab where col2=8 ;

select * from norm_tab where col2=8 ;

select * from part_tab where col2=8 and id=2;

select * from norm_tab where col2=8 and id=2;



--查看索引高度等信息

select index_name,

          blevel,

          leaf_blocks,

          num_rows,

          distinct_keys,

          clustering_factor

     from user_ind_statistics

    where table_name in( 'NORM_TAB');

    

select index_name,

          blevel,

          leaf_blocks,

          num_rows,

          distinct_keys,

          clustering_factor FROM USER_IND_PARTITIONS where index_name like 'IDX_PAR_TAB%';

select * from part_tab where col3=8 ;

4.各种索引性能比较

a.最慢速度(无索引)

drop table t purge;

create table t as  select * from dba_objects;

alter table T modify OBJECT_NAME not null;

select count(*) from t;

set autotrace traceonly

set linesize 1000

set timing on 

select COUNT(*) FROM T;

b.快了一点(有普通索引)

drop table t purge;

create table t as  select * from dba_objects;

alter table T modify OBJECT_NAME not null;

create  index idx_object_name on t(object_name);

set autotrace traceonly

set timing on 

select count(*) from t;

c.又快一点(有了一个合适的位图索引)

位图索引占用空间很小

drop table t purge;

create table t as  select * from dba_objects;

 Update t  Set object_name='abc'; 

 Update t Set object_name='evf' Where rownum<=20000;

create bitmap index idx_object_name on t(object_name);

set autotrace traceonly

set timing on

select count(*) from t;



注:如果记录数不重复或者说重复度很低,ORACLE会选择全表扫描,如果用

来强制,可以发现性能很低下。

alter session set statistics_level=all ;

set linesize 1000

set pagesize 1

select /*+index(t,idx_object_name)*/ count(*) from test t;

select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));



d.再快一点(物化视图,注意使用的场景)

实时性要求不高

drop materialized view MV_COUNT_T;

drop table t purge;

create table t as  select * from dba_objects;

 Update t  Set object_name='abc'; 

 Update t Set object_name='evf' Where rownum<=20000;



create  materialized view  mv_count_t

                    build immediate

                    refresh on commit

                    enable query rewrite

                    as

                    select count(*) FROM T;

set autotrace traceonly

set linesize 1000

select COUNT(*) FROM T; 



e.又再快一点(缓存结果集,也是要注意使用的场景)

drop table t purge;

create table t as  select * from dba_objects;

select count(*) from t;

set linesize 1000

set autotrace traceonly

select /*+ result_cache */ count(*) from t;



f.速度之王来咯!(原来需求才是王道)

select count(*) from t where rownum=1;

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

Oracle性能优化2- 依据场景选择技术的更多相关文章

  1. 我眼中的 Oracle 性能优化

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

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

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

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

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

  4. oracle性能优化之awr分析

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

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

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

  6. Oracle 性能优化的基本方法

    Oracle 性能优化的基本方法概述 1)设立合理的性能优化目标. 2)测量并记录当前性能. 3)确定当前Oracle性能瓶颈(Oracle等待什么.哪些SQL语句是该等待事件的成分). 4)把等待事 ...

  7. Oracle性能优化小结

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

  8. oracle性能优化(项目中的一个sql优化的简单记录)

    在项目中,写的sql主要以查询为主,但是数据量一大,就会突出sql性能优化的重要性.其实在数据量2000W以内,可以考虑索引,但超过2000W了,就要考虑分库分表这些了.本文主要记录在实际项目中,一个 ...

  9. oracle 性能优化建议小结

    原则一:注意WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHER ...

  10. 浅谈Oracle 性能优化

    基于大型Oracle数据库应用开发已有6个年头了,经历了从最初零数据演变到目前上亿级的数据存储.在这个经历中,遇到各种各样的性能问题及各种性能优化. 在这里主要给大家分享一下数据库性能优化的一些方法和 ...

随机推荐

  1. EF 数据迁移

    数据迁移: 在程序包管理器控制台,执行语句. 初始化: 1.Enable-Migrations -EnableAutomaticMigrations 2.Add-Migration InitialCr ...

  2. python3进行汉字和unicode码的转换

    输出某个unicode码对应的汉字和某个汉字对应的unicode编码. # -*- coding=UTF-8 -*- str1 = "\u6000"#某个汉字的unicode码 s ...

  3. python 2.X 和 3.X 的区别汇总

    python 2.x                                                     python 3.x print() 或者 print “abc”都可以  ...

  4. CAP与Base理论

    分布一致性的提出 在分布式系统中要解决的一个重要问题就是数据的复制.在我们的日常开发经验中,相信很多开发人员都遇到过这样的问题:假设客户端C1将系统中的一个值K由V1更新为V2,但客户端C2无法立即读 ...

  5. hibernateTemplate API

    https://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateT ...

  6. K-means算法的实现

    K-MEANS算法是一种经典的聚类算法,在模式识别得到了广泛的应用.算法中有两个关键问题需要考虑:一是如何评价对象的相似性,通常用距离来度量,距离越近越相似:另外一个是如何评价聚类的效果,通常采用误差 ...

  7. CentOS7下解决yum install mysql-server没有可用包

    # wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm --  http://repo.mysql.com/mysq ...

  8. CSS同时选择器

    [CSS同时选择器] 同一个div拥有多个class时,我们可以作多个class作为组合来选择对象.方法就是将多个.className直接连接在一起(中间不能有空格). <p class=&qu ...

  9. laravel 5.1部署到 集成环境 lnmp上

    laravel 5.1 需要配置:php版本 >= 5.5.9 如果php版本不够可以升级 1.切换到安装包目录 # cd /lnmp1.3-full 2.升级php命令 # ./upgrade ...

  10. HttpSession 和 HttpSession

    说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案.