oracle索引

Oracle 建立索引及SQL优化

浪子不回头ぞ 提交于 2019-11-26 14:35:34
Oracle 建立索引及SQL优化 数据库索引: 索引有单列索引 复合索引之说 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。 建设原则:  1、索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%。则应该考虑。  2、对于两表连接的字段,应该建立索引。如果经常在某表的一个字段进行Order By 则也经过进行索引。  3、不应该在小表上建设索引。 优缺点:  1、索引主要进行提高数据的查询速度。 当进行DML时,会更新索引。因此索引越多,则DML越慢,其需要维护索引。 因此在创建索引及DML需要权衡。 创建索引:  单一索引: Create Index < Index -Name> On <Table_Name>(Column_Name);  复合索引: Create Index i_deptno_job on emp(deptno,job); —>在emp表的deptno、job列建立索引。    select * from emp where deptno= 66 and job= 'sals' ->走索引。    select * from emp where deptno= 66 OR job= 'sals' ->将进行全表扫描

oracle索引碎片

走远了吗. 提交于 2019-11-26 14:34:32
author:skate time:2010-05-31 索引页块碎片(Index Leaf Block Fragmentation) 这篇文章将会回答如下问题: 什么是索引页块碎片?什么时候被重用? 什么是半空索引碎片?什么时候被重用? oracle的标准索引结构是B×tree结构,一个B×tree结构由三种block组成 根块(root block): 在B×tree里有且只有一个block,所有访问索引都从这开始,root block下有很多child blocks。 分支块(Branch blocks): 这是中间层,branch block是没有什么限制的,它是随着leaf block的增加而增加的,branch block一般是4层,如果多于4层,就影响性能了。在我们删除行时,branch block是不被删除的。 叶块(leaf block): 叶块是最底层,上面存储着索引条目和rowid 索引和表数据是级联关系的,当删除表数据的时候,索引条目也会被自动删除,这样在index leaf block就会产生碎片,这也就是在OLTP系统上有大量更新的表上不建议创建大量的索引,很影响性能 有的人说删除过的索引条目空间不会被再用,因为在应用中不会再有insert相同的数据。其实这个 说法不完全对的,除了半空叶块外,其他的删除的索引空间是可被再利用的。 eg:

SQL不走索引的几种常见情况

半城伤御伤魂 提交于 2019-11-26 14:34:22
我们写的SQL语句很多时候where条件用到了添加索引的列,但是却没有走索引,在网上找了资料,发现不是很准确,所以自己验证了一下,记一下笔记。 这里实验数据库为 MySQL(oracle也类似)。 查看表的索引的语句: show keys from 表名 查看SQL执行计划的语句(SQL语句前面添加 explain 关键字):explain select* from users u where u.name = 'mysql测试' 第一步、创建一个简单的表并添加几条测试数据 CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `upTime` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `pk_users_name` (`name`) ) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; 设置索引的字段:id、name; 第二步、查看我们表的索引 # 查看索引 show keys from

oracle 指定索引

本小妞迷上赌 提交于 2019-11-26 14:33:48
表中如果创建多个索引, 测试发现使用不同索,查询效率有较大差别。 我们希望使用某个更快的索引, 这个时候需要指定索引,以明确告诉oracle使用更快的索引。 oracle指定索引语法: /*+index(t ind_name)*/ “t”: 为表的别名, 如果查询语句中有表别名,这里必须使用表别名, 如果没有表别名,则直接使用表名 “ind_name”: 要使用的索引名称。 需要将指定索引的语句写在查询语句的最前面, 放在中间可能无法生效。 测试: 不指定索引时, oracle自己选择一个索引来使用。 如下图, 默认情况下使用了ind_class_name索引 select t.class_name, t.rowid from t_user t where t.name='x' and t.class_name='x'; 通过指定索引, 明确使用其他索引, 如下图,使用了ind_name索引 select /*+index(t ind_name)*/ t.class_name, t.rowid from t_user t where t.name='x' and t.class_name='x'; 来源: CSDN 作者: changerzhuo 链接: https://blog.csdn.net/changerzhuo_319/article/details/87905196

Oracle执行计划不走索引的原因总结

前提是你 提交于 2019-11-26 14:32:55
在 Oracle 数据库操作中,为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确 不走索引 呢?如何解决呢?本文我们主要就介绍这部分内容,接下来就让我们一起来了解一下。 不走索引大体有以下几个原因: 你在Instance级别所用的是all_rows的方式 你的表的统计信息(最可能的原因) 你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。 解决方法: 可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint。 不走索引的其它原因: 1、建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。 2、在包含有null值的table列上建立索引,当时使用select count(*) from table时不会使用索引。 3、在索引列上使用函数时不会使用索引,如果一定要使用索引只能建立函数索引。 4、当被索引的列进行隐式的类型转换时不会使用索引。如:select * from t where indexed_column = 5,而indexed_column列建立索引但类型是字符型,这时Oracle会产生隐式的类型转换,转换后的语句类似于select * from t where to_number(indexed_column) = 5

oracle 不走索引的原因

让人想犯罪 __ 提交于 2019-11-26 14:31:34
create table tb2 as select * from emp; alter table tb2 modify empno number(4) not null; 翻到20W行 create index idxtb21 on tb2(empno); select INDEX_NAME from dba_indexes where table_name='TB2';--验证index建立起来 set autotrace on; select distinct empno from tb2;--走index select distinct ename from tb2 where empno=7934;--未走index select distinct ename from tb2 where empno=7934;--hint后,也未走index create index idxtb22 on tb2(ename);--难道和ename有关系?(按理说应该没关系,建上吧) select ename from tb2 where empno=7934;--还是不走index 重建index alter index idxtb21 rebuild ; 1.alter index xxx rebuild [online]; 是否加online,要看你的系统需求

oracle优化一则--不走索引

此生再无相见时 提交于 2019-11-26 14:31:02
1、问题 一个查询未走索引,从一个视图中查询,视图定义为5张表的union all。 有明显的条件TMH12 = '1001271876' 2、排查 @?/rdbms/admin/sqltrpt 脚本生成优化建议 通过建议来看,是生成索引的建议,对列进行格式转换,TO_CHAR("TMH12"), 1- Index Finding (see explain plans section below) The execution plan of this statement can be improved by creating one or more indices. Recommendation (estimated benefit: 99.48%) Consider running the Access Advisor to improve the physical schema design or creating the recommended index. create index HICANO_POS.IDX 2 0260001 o n H I C A N O P O S . E C P H P D A ( T O C H A R ( " T M H 12 " ) ) ; − C o n s i d e r r u n n i n g t h e A c c e s s

Oracle SQL不走索引小记

折月煮酒 提交于 2019-11-26 14:30:38
SQL执行计划不走索引 一、优化器认为走全表扫描更优。 在这种情况下,需要重新分析一遍表,更新表的状态,有助于优化器分析出正确的执行计划。 analyze table tablename compute statistics; analyze index indexname compute statistics; 或者 execdbms_stats.gather_schema_stats( - ownname => 'SCOTT', - options => 'GATHER AUTO', - estimate_percent => dbms_stats.auto_sample_size, - method_opt => 'for all columns size repeat', - degree => 15 - ) 二、优化器模式 使用了all_rows模式 三、无法使用索引。 无法使用索引是由于sql写法有问题。 1、建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。 2、在包含有null值的table列上建立索引。 3、在索引列上使用函数时不会使用索引。 select * from table_name from to_char(date,'YYYY/MM/DD')='2015/01/01' 不走索引 select * from

数据库设计60个技巧

为君一笑 提交于 2019-11-26 12:47:01
数据库设计指南 如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分。有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述。不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲。所以我们最近找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验。我们的编辑从收到的130 个反馈中精选了其中的60 个最佳技巧,并把这些技巧编写成了本文,为了方便索引其内容划分为5 个部分: 第1 部分— 设计数据库之前 这一部分罗列了12 个基本技巧,包括命名规范和明确业务需求等。 第2 部分— 设计数据库表 总共24 个指南性技巧,涵盖表内字段设计以及应该避免的常见问题等。 第3 部分— 选择键 怎么选择键呢?这里有10 个技巧专门涉及系统生成的主键的正确用法,还有何时以及如何索引字段以获得最佳性能等。 第 4 部分 — 保证数据完整性 讨论如何保持数据库的清晰和健壮,如何把有害数据降低到最小程度。 第5 部分— 各种小技巧 不包括在以上4 个部分中的其他技巧,五花八门,有 了它们希望你的数据库开发工作会更轻松一些。 第1 部分— 设计数据库之前 考察现有环境 在设计一个新数据库时,你不但应该仔细研究业务需求而且还要考察现有的系统。大多数数据库项目都不是从头开始建立的;通常,机构内总会存在用来满足特定需求的现有系统(可能没有实现自动计算)。显然

看懂Oracle执行计划

老子叫甜甜 提交于 2019-11-26 12:29:25
一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看Oracle执行计划? 因为我一直用的PLSQL远程连接的公司数据库,所以这里以PLSQL为例: ①:配置执行计划需要显示的项: 工具 —> 首选项 —> 窗口类型 —> 计划窗口 —> 根据需要配置要显示在执行计划中的列 执行计划的常用列字段解释: 基数(Rows):Oracle估计的当前操作的返回结果集行数 字节(Bytes):执行该步骤后返回的字节数 耗费(COST)、CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好(该值可能与实际有出入) 时间(Time):Oracle估计的当前操作所需的时间 ②:打开执行计划: 在SQL窗口执行完一条select语句后按 F5 即可查看刚刚执行的这条查询语句的执行计划 注:在PLSQL中使用SQL命令查看执行计划的话,某些SQL*PLUS命令PLSQL无法支持,比如SET AUTOTRACE ON 三:看懂Oracle执行计划 ①:执行顺序: 根据Operation缩进来判断,缩进最多的最先执行;(缩进相同时,最上面的最先执行) 例:上图中 INDEX RANGE SCAN 和 INDEX UNIQUE SCAN 两个动作缩进最多,最上面的 INDEX RANGE SCAN 先执行;