oracle如何改善索引 oracle 索引改名

Oracle索引技术之如何建立最佳索引怎样建立最佳索引? 1、明确地创建索引 create index index_name on table_name(field_name) tablespace tablespace_name pctfree 5 initrans 2 maxtrans 255 storage ( minextents 1 maxextents 16382 pctincrease 0 ); 2、创建基于函数的索引 常用与UPPER、LOWER、TO_CHAR(date)等函数分类上,例: create index idx_func on emp(UPPER(ename)) tablespace tablespace_name; 3、创建位图索引 对基数较?。一喽晕榷ǖ牧薪⑺饕保紫扔Ω每悸俏煌妓饕?nbsp;, 例: create bitmap index idx_bitm on class (classno) tablespace tablespace_name; 4、明确地创建唯一索引 可以用create unique index语句来创建唯一索引,例: create unique index dept_unique_idx on dept(dept_no) tablespace idx_1; 5、创建与约束相关的索引 可以用using index字句,为与unique和primary key约束相关的索引,例: alter table table_name add constraint PK_primary_keyname primary key(field_name) using index tablespace tablespace_name; 如何创建局部区索引? 1)基础表必须是分区表 2)分区数量与基础表相同 3)每个索引分区的子分区数量与相应的基础表分区相同 4)基础表的自分区中的行的索引项,被存储在该索引的相应的自分区中,例如 create index TG_CDR04_SERV_ID_IDX on TG_CDR04(SERV_ID) Pctfree 5 Tablespace TBS_AK01_IDX Storage( MaxExtents 32768 PctIncrease 0 FreeLists 1 FreeList Groups 1 ) local / 如何创建范围分区的全局索引? 基础表可以是全局表和分区表 create index idx_start_date on tg_cdr01(start_date) global partition by range(start_date) (partition p01_idx vlaues less than ('0106') partition p01_idx vlaues less than ('0111') ... partition p01_idx vlaues less than ('0401')) / 如何重建现存的索引? 重建现存的索引的当前时刻不会影响查询 重建索引可以删除额外的数据块 提高索引查询效率 alter index idx_name rebuild nologging; 对于分区索引 alter index idx_name rebuild partition partition_name nologging; 删除索引的原因? 1)不再需要的索引 2)索引没有针对其相关的表所发布的查询提供所期望的性能改善 3)应用没有用该索引来查询数据 4)该索引无效 , 必须在重建之前删除该索引 5)该索引已经变的太碎了 , 必须在重建之前删除该索引 语句: drop index idx_name; drop index idx_name partition partition_name; 建立索引的代价? 基础表维护时 , 系统要同时维护索引,不合理的索引将严重影响系统资源,主要表现在CPU和I/O上 。插入、更新、删除数据产生大量db file sequential read锁等待 。
在Oracle中合理创建数据库的索引 在Oracle数据库中 创建索引虽然比较简单 但是要合理的创建索引则比较困难了 笔者认为 在创建索引时要做到三个适当 即在适当的表上 适当的列上创建适当数量的索引 虽然这可以通过一句话来概括优化的索引的基本准则 但是要做到这一点的话 需要数据库管理员做出很大的努力 具体的来说 要做到这个三个适当有如下几个要求
一 根据表的大小来创建索引
虽然给表创建索引 可以提高查询的效率 但是数据库管理员需要注意的是 索引也需要一定的开销的 为此并不是说给所有的表都创建索引 那么就可以提高数据库的性能 这个认识是错误的 恰恰相反 如果不管三七二十一 给所有的表都创建了索引 那么其反而会给数据库的性能造成负面的影响 因为此时滥用索引的开销可能已经远远大于由此带来的性能方面的收益 所以笔者认为 数据库管理员首先需要做到 为合适的表来建立索引 而不是为所有的表建立索引
一般来说 不需要为比较小的表创建索引 如在一个ERP系统的数据库中 department表用来存储企业部门的信息 一般企业的部分也就十几个 最多不会超过一百个 这 条记录对于人来说 可能算是比较多了 但是对于计算机来说 这给他塞塞牙缝都还不够 所以 对类似的小表没有必要建立索引 因为即使建立了索引 其性能也不会得到很大的改善 相反索引建立的开销 如维护成本等等 要比这个要大 也就是说 付出的要比得到的多 显然违反常理
另外 就是对于超大的表 也不一定要建立索引 有些表虽然比较大 记录数量非常的多 但是此时为这个表建立索引并一定的合适 如系统中有一张表 其主要用来保存数据库中的一些变更信息 往往这些信息只给数据库管理员使用 此时为这张表建立索引的话 反而不合适 因为这张表很少用到 只有在出问题的时候才需要查看 其次其即使查看 需要查询的纪录也不会很多 可能就是最近一周的更新记录等等 对于对于一些超大的表 建立索引有时候往往不能够达到预计的效果 而且在打表上建立索引 其索引的开销要比普通的表大的多 那么到底是否给大表建立索引呢?笔者认为 主要是看两个方面的内容 首先是需要关注一下 在这张大表中经常需要查询的记录数量 一般来说 如果经常需要查询的数据不超过 %到 %的话 那就没有必要为其建立索引的必要 因为此时建立索引的开销可能要比性能的改善大的多 这个比例只是一个经验的数据 如果数据库管理员需要得出一个比较精确的结论 那么就需要进行测试分析 即数据库管理员需要测试一下全表扫描的时间 看看其是否比建立索引后的查询时间要长或者短 如果是长的话 则说明有建立索引的必要 但是如果没有的话 则说明还是全表扫描速度来的快 此时也就没有必要建立索引了
总之 在考虑是否该为表建立索引时 一般来说小表没有建立索引的必要 而对于打表的话 则需要进行实际情况实际分析 简单一点的 可以根据大致的比率来确定 如果要精确一点的 则可以进行全表扫描性能分析 以判断建立索引后是否真的如预期那样改善了数据库性能
二 根据列的特征来创建索引
列的特点不同 索引创建的效果也不同 数据库管理员需要了解为哪些列创建索引可以起到事倍功半的效果 同时也需要了解为哪些列创建索引反而起到的是事倍功半的效果 这有利于他们了解到底给为怎么样的字段建立索引
根据笔者的经验 往往为如下特征的列创建索引能够起到比较明显的效果 如对于一些重复内容比较少的列 特别是对于那些定义了唯一约束的列 在这些列上建立索引 往往可以起到非常不错的效果 如对于一些null值的列与非Null值的列混合情况下 如果用户需要经常查询所有的非Null值记录的列 则最好为其设置索引 如果经常需要多表连接查询 在用与连接的列上设置索引可以达到事半功倍的效果
可见 索引设置的是否恰当 不仅跟数据库设计架构有关 而且还跟企业的经济业务相关 为此 对于一些套装软件 虽然一开始数据库管理员已经做了索引的优化工作 但是随着后来经济数据的增加 这个索引的效果会越来越打折扣 这主要是因为记录的表化影响到了索引优化的效果 所以笔者建议各位数据库管理员 即使采用的是大牌软件公司的套装软件 也需要隔一段时间 如一年 对数据库的索引进行优化 该去掉的去掉 该调整的调整 以提高数据库的性能
如在数据库中有一张表是用来保存用户信息的 其中有个字段身份证号码 这是一个唯一的字段 在数据库设计时 给这个字段创建了索引 但是当这个数据库投入使用之后 用户不怎么输入用户的身份证号码 而且平时也基本不按这个号码来进行查询 当记录月来月多时 这个身份证号码上的索引字段不但不能够改善数据库的查询性能 反而成了鸡肋 对于这些有很多NULL值的列 而且不会经常查询所有的非NULL值记录的列 数据库管理员要下决心 即使清除这些列上的索引
所以说索引的优化与调整是一个动态的过程 并不是说数据库设计好之后就不需要经过调整 数据库管理员往往需要根据记录的变化情况 来进行适当的变更 以提高索引的效果
三 在一个表上创建多少索引合适?
虽然说 在表上创建索引的数量没有限制 但是决不是越多越好 也就是说 在创建索引这项事情上〉 往往不成立 有时候 创建索引越多 其可能会得到适得其反的效果 那么在一个表上 到底给创建多少索引合适呢?这个没有一个明确的标准 而是需要数据库管理员根据实际的用途以及数据库中记录的情况 来进行判断
通常来说 表的索引越多 其查询的速度也就越快 但是 表的更新速度则会降低 这主要是因为表的更新(如往表中插入一条记录)速度 反而随着索引的增加而增加 这主要是因为 在更新记录的同时需要更新相关的索引信息 为此 到底在表中创建多少索引合适 就需要在这个更新速度与查询速度之间取得一个均衡点 如对于一些数据仓库或者决策型数据库系统 其主要用来进行查询 相关的记录往往是在数据库初始化的时候倒入 此时 设置的索引多一点 可以提高数据库的查询性能 同时因为记录不怎么更新 所以索引比较多的情况下 也不会影响到更新的速度 即使在起初的时候需要导入大量的数据 此时也可以先将索引禁用掉 等到数据导入完毕后 再启用索引 可以通过这种方式来减少索引对数据更新的影响 相反 如果那些表中经常需要更新记录 如一些事务型的应用系统 数据更新操作是家常便饭的事情 此时如果在一张表中建立过多的索引 则会影响到更新的速度 由于更新操作比较频繁 所以对其的负面影响 要比查询效率提升要大的多 此时就需要限制索引的数量 只在一些必要的字段上建立索引
笔者在平时数据库优化时 往往会根据这些表的用途来为列设置索引 可以查询相关的动态视图 看看对于这张表的操作 是更新操作(包括更新 删除 插入等等)占的比例大 还是查询操作占的比例大 当过多的索引已经影响到更新操作的速度时 则数据库管理员就需要先禁用某些索引 以提高数据库的性能
lishixinzhi/Article/program/Oracle/201311/18407
如何选择和优化Oracle索引Oracle 建立索引及SQL优化
Oracle 建立索引及SQL优化
数据库索引:
索引有单列索引
复合索引之说
如何某表的某个字段有主键约束和唯一性约束oracle如何改善索引 , 则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' -将进行全表扫描 。不走索引
select * from emp where deptno=66 -走索引 。
select * from emp where job='sals' -进行全表扫描、不走索引 。
如果在where 子句中有OR 操作符或单独引用Job 列(索引列的后面列) 则将不会走索引,将会进行全表扫描 。
Sql 优化:
当Oracle数据库拿到SQL语句时 , 其会根据查询优化器分析该语句,并根据分析结果生成查询执行计划 。
也就是说 , 数据库是执行的查询计划,而不是Sql语句 。
查询优化器有rule-based-optimizer(基于规则的查询优化器) 和Cost-Based-optimizer(基于成本的查询优化器) 。
其中基于规则的查询优化器在10g版本中消失 。
对于规则查询,其最后查询的是全表扫描 。而CBO则会根据统计信息进行最后的选择 。
1、先执行From -Where -Group By-Order By
2、执行From 字句是从右往左进行执行 。因此必须选择记录条数最少的表放在右边 。这是为什么呢?
3、对于Where字句其执行顺序是从后向前执行、因此可以过滤最大数量记录的条件必须写在Where子句的末尾,而对于多表之间的连接,则写在之前 。
因为这样进行连接时 , 可以去掉大多不重复的项 。
4. SELECT子句中避免使用(*)ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间
5、索引失效的情况:
① Not Null/Null 如果某列建立索引,当进行Select * from emp where depto is not null/is null 。则会是索引失效 。
② 索引列上不要使用函数,SELECT Col FROM tbl WHERE substr(name ,1 ,3 ) = 'ABC'
或者SELECT Col FROM tbl WHERE name LIKE '獵%' 而SELECT Col FROM tbl WHERE name LIKE 'ABC%' 会使用索引 。
③ 索引列上不能进行计算SELECT Col FROM tbl WHERE col / 1010 则会使索引失效,应该改成
SELECT Col FROM tbl WHERE col10 * 10
④ 索引列上不要使用NOT ( != 、)如:SELECT Col FROM tbl WHERE col ! = 10
应该 改成:SELECT Col FROM tbl WHERE col10 OR col10。
6、用UNION替换OR(适用于索引列)
union:是将两个查询的结果集进行追加在一起,它不会引起列的变化 。由于是追加操作,需要两个结果集的列数应该是相关的,
并且相应列的数据类型也应该相当的 。union 返回两个结果集,同时将两个结果集重复的项进行消除 。如果不进行消除,用UNOIN ALL.
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效.
如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.
高效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE REGION = “MELBOURNE”
低效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.
7. 用EXISTS替代IN、用NOT EXISTS替代NOT IN
在许多基于基础表的查询中, 为了满足一个条件, 往往需要对另一个表进行联接. 在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.
在子查询中, NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下, NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历).
为了避免使用NOT IN, oracle如何改善索引我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.
例子:
高效: SELECT * FROM EMP (基础表) WHERE EMPNO0 AND EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)
低效: SELECT * FROM EMP (基础表) WHERE EMPNO0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)
如何更好的使用Oracle全文索引不使用Oracle text功能,也有很多方法可以在Oracle数据库中搜索文本.可以使用标准的INSTR函数和LIKE操作符实现 。
SELECT *FROM mytext WHERE INSTR (thetext, 'Oracle')0;
SELECT * FROM mytext WHERE thetext LIKE '%Oracle%';
有很多时候,使用instr和like是很理想的, 特别是搜索仅跨越很小的表的时候.然而通过这些文本定位的方法将导致全表扫描,对资源来说消耗比较昂贵,而且实现的搜索功能也非常有限,因此对海量的文本数据进行搜索时,建议使用oralce提供的全文检索功能 建立全文检索的步骤步骤一 检查和设置数据库角色首先检查数据库中是否有CTXSYS用户和CTXAPP脚色 。如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能 。你必须修改数据库以安装这项功能 。默认安装情况下 , ctxsys用户是被锁定的,因此要先启用ctxsys的用户 。步骤二 赋权 在ctxsys用户下把ctx_ddl的执行权限赋于要使用全文索引的用户,例oracle如何改善索引:
grant execute on ctx_ddl to pomoho;
步骤三 设置词法分析器(lexer)
Oracle实现全文检索,其机制其实很简单 。即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle 称为 term)找出来,记录在一组 以dr$开头的表中,同时记下该term出现的位置、次数、hash 值等信息 。检索时 , Oracle 从这组表中查找相应的term,并计算其出现频率 , 根据某个算法来计算每个文档的得分(score),即所谓的‘匹配率’ 。而lexer则是该机制的核心,它决定了全文检索的效率 。Oracle 针对不同的语言提供了不同的 lexer, 而我们通常能用到其中的三个:
nbasic_lexer: 针对英语 。它能根据空格和标点来将英语单词从句子中分离 , 还能自动将一些出现频率过高已经失去检索意义的单词作为‘垃圾’处理 , 如if , is 等,具有较高的处理效率 。但该lexer应用于汉语则有很多问题,由于它只认空格和标点,而汉语的一句话中通常不会有空格,因此,它会把整句话作为一个 term,事实上失去检索能力 。以‘中国人民站起来了’这句话为例,basic_lexer 分析的结果只有一个term ,就是‘中国人民站起来了’ 。此时若检索‘中国’ , 将检索不到内容 。
nchinese_vgram_lexer: 专门的汉语分析器,支持所有汉字字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8 ) 。该分析器按字为单元来分析汉语句子 。‘中国人民站起来了’这句话,会被它分析成如下几个term: ‘中’,‘中国’,‘国人’,‘人民’,‘民站’,‘站起’ , 起来’,‘来了’,‘了’ 。可以看出,这种分析方法,实现算法很简单,并且能实现‘一网打尽’,但效率则是差强人意 。
nchinese_lexer: 这是一个新的汉语分析器 , 只支持utf8字符集 。上面已经看到,chinese vgram lexer这个分析器由于不认识常用的汉语词汇,因此分析的单元非常机械,像上面的‘民站’,‘站起’在汉语中根本不会单独出现,因此这种term是没有意义的,反而影响效率 。chinese_lexer的最大改进就是该分析器 能认识大部分常用汉语词汇,因此能更有效率地分析句子,像以上两个愚蠢的单元将不会再出现 , 极大 提高了效率 。但是它只支持 utf8, 如果你的数据库是zhs16gbk字符集,则只能使用笨笨的那个Chinese vgram lexer.
如果不做任何设置,Oracle 缺省使用basic_lexer这个分析器 。要指定使用哪一个lexer, 可以这样操作:
第一. 当前用户下下建立一个preference(例:在pomoho用户下执行以下语句)
exec ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');
第二.在建立全文索引索引时,指明所用的lexer:
CREATE INDEX myindex ON mytable(mycolumn) indextype is ctxsys.context
parameters('lexer my_lexer');
这样建立的全文检索索引 , 就会使用chinese_vgram_lexer作为分析器 。
步骤四 建立索引
通过以下语法建立全文索引
【oracle如何改善索引 oracle 索引改名】CREATE INDEX [schema.]index on [schema.]table(column) INDEXTYPE IS ctxsys.context [ONLINE]
LOCAL [(PARTITION [partition] [PARAMETERS('paramstring')]
[, PARTITION [partition] [PARAMETERS('paramstring')]])]
[PARAMETERS(paramstring)] [PARALLEL n] [UNUSABLE];
例:
CREATE INDEX ctx_idx_menuname ON pubmenu(menuname)
indextype is ctxsys.context parameters('lexer my_lexer')
步骤五 使用索引
使用全文索引很简单 , 可以通过:
select * from pubmenu where contains(menuname,'上传图片')0
全文索引的种类
建立的Oracle Text索引被称为域索引(domain index) , 包括4种索引类型:
l CONTEXT
2 CTXCAT
3 CTXRULE
4 CTXXPATH
依据你的应用程序和文本数据类型你可以任意选择一种 。
对多字段建立全文索引
很多时候需要从多个文本字段中查询满足条件的记录,这时就需要建立针对多个字段的全文索引,例如需要从pmhsubjects(专题表)的 subjectname(专题名称)和briefintro(简介)上进行全文检索,则需要按以下步骤进行操作:
?建议多字段索引的preference
以ctxsys登录,并执行:
EXEC ctx_ddl.create_preference(' ctx_idx_subject_pref',
'MULTI_COLUMN_DATASTORE');
? 建立preference对应的字段值(以ctxsys登录)
EXEC ctx_ddl.set_attribute(' ctx_idx_subject_pref ','columns','subjectname,briefintro');
? 建立全文索引
CREATE INDEX ctx_idx_subject ON pmhsubjects(subjectname)
INDEXTYPE ISctxsys.CONTEXT PARAMETERS('DATASTORE ctxsys.ctx_idx_subject_pref lexer my_lexer')
? 使用索引
select * from pmhsubjects where contains(subjectname,'李宇春')0
全文索引的维护
对于CTXSYS.CONTEXT索引,当应用程序对基表进行DML操作后,对基表的索引维护是必须的 。索引维护包括索引同步和索引优化 。
在索引建好后 , 我们可以在该用户下查到Oracle自动产生了以下几个表:(假设索引名为myindex):
DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N其中以I表最重要,可以查询一下该表,看看有什么内容:
SELECT token_text, token_count FROM dr$i_rsk1$I WHERE ROWNUM = 20;
这里就不列出查询接过了 。可以看到,该表中保存的其实就是Oracle 分析你的文档后,生成的term记录在这里 , 包括term出现的位置、次数、hash值等 。当文档的内容改变后,可以想见这个I表的内容也应该相应改变,才能保证Oracle在做全文检索时正确检索到内容(因为所谓全文检索,其实核心就是查询这个表) 。这就用到sync(同步) 和 optimize(优化)了 。
同步(sync): 将新的term 保存到I表oracle如何改善索引;
优化(optimize): 清除I表的垃圾,主要是将已经被删除的term从I表删除 。
当基表中的被索引文档发生insert、update、delete操作的时候,基表的改变并不能马上影响到索引上直到同步索引 。可以查询视图 CTX_USER_PENDING查看相应的改动 。例如:
SELECT pnd_index_name, pnd_rowid,
TO_CHAR (pnd_timestamp, 'dd-mon-yyyy hh24:mi:ss') timestamp
FROM ctx_user_pending;
该语句的输出类似如下:
PND_INDEX_NAMEPND_ROWIDTIMESTAMP
------------------------------ ------------------ --------------------
MYINDEXAAADXnAABAAAS3SAAC 06-oct-1999 15:56:50
同步和优化方法: 可以使用Oracle提供的ctx_ddl包同步和优化索引
一.对于CTXCAT类型的索引来说, 当对基表进行DML操作的时候,Oracle自动维护索引 。对文档的改变马上反映到索引中 。CTXCAT是事务形的索引 。
索引的同步
在对基表插入,修改,删除之后同步索引 。推荐使用sync同步索引 。语法:
ctx_ddl.sync_index(
idx_name IN VARCHAR2 DEFAULT NULL
memory IN VARCHAR2 DEFAULT NULL,
part_name IN VARCHAR2 DEFAULT NULL
parallel_degree IN NUMBER DEFAULT 1);
idx_name索引名称
memory指定同步索引需要的内存 。默认是系统参数DEFAULT_INDEX_MEMORY。
指定一个大的内存时候可以加快索引效率和查询速度,且索引有较少的碎片
part_name 同步哪个分区索引 。
parallel_degree 并行同步索引 。设置并行度 。
例如:
同步索引myindex:Execctx_ddl.sync_index ('myindex');
实施建议:建议通过oracle的job对索引进行同步
索引的优化
经常的索引同步将会导致你的CONTEXT索引产生碎片 。索引碎片严重的影响了查询的反应速度 。你可以定期优化索引来减少碎片,减少索引大小,提高查询效率 。
当文本从表中删除的时候,Oracle Text标记删除的文档 , 但是并不马上修改索引 。因此,就的文档信息占据了不必要的空间,导致了查询额外的开销 。你必须以FULL模式优化索引,从索引中删除无效的旧的信息 。这个过程叫做垃圾处理 。当你经常的对表文本数据进行更新 , 删除操作的时候 , 垃圾处理是很必要的 。
execctx_ddl.optimize_index ('myidx', 'full');
实施建议:每天在系统空闲的时候对全文索引进行相应的优化,以提高检索的效率
P.S.定时优化索引
3.定时优化同步域索引
创建定时任务,定期优化和同步域索引
SQL create or replace procedure hsp_sync_index as
2begin
3ctx_ddl.sync_index('id_cont_msg');
4end;
5/
Procedure created.
Elapsed: 00:00:00.08
SQL VARIABLE jobno number;
SQL BEGIN
2 DBMS_JOB.SUBMIT(:jobno,'hsp_sync_index();',
3 SYSDATE, 'SYSDATE(1/24/4)');
4 commit;
5 END;
6 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.27
SQL create or replace procedure hsp_optimize_index as
2begin
3ctx_ddl.optimize_index('id_cont_msg','FULL');
4end;
5/
SQL VARIABLE jobno number;
SQL BEGIN
2 DBMS_JOB.SUBMIT(:jobno,'hsp_optimize_index();',
3 SYSDATE, 'SYSDATE1');
4 commit;
5 END;
6 /
Procedure created.
Elapsed: 00:00:00.03
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.02
SQL
oracle数据库如何重建索引当索引的碎片过多时,会影响执行查询的速度,从而影响到我们的工作效率 。这时候采取的最有利的措施莫过于重建索引了 。本文主要介绍了Oracle数据库中检查索引碎片并重建索引的过程 , 接下来我们就开始介绍这一过程 。重建索引的步骤如下: 1. 确认基本信息 登入数据库,找到专门存放index 的tablespace , 并且这个tablespace下所有index的owner都是tax.将index专门存放在一个独立的tablespace, 与数据表的tablespace分离,是常用的数据库设计方法 。2. 查找哪些index需要重建 通过anlyze index .... validate structure命令可以分析单个指定的index , 并且将单个index 分析的结果存放到 index_stats试图下 。一般判断的依据是: height 4 pct_used50% del_lf_rows / lf_rows0.0010.03 g ) 3. google上下载了遍历所有index脚本 发现anlyze index .... validate structure只能填充单个index分析信息,于是google了下 , 从网上下了个Loop 脚本 , 遍历索引空间下所有的索引名字,并且可以把所有index的分析信息存放到自己建立的一个用户表中 。4. anlyze index 锁定index 发现下载的脚本不好用,应为anlyze index在分析索引前要争取独占锁,锁住index , 很明显有些index正在被应用系统的使用 , 所以运行anlyze失败 。这里吸取的教训是,尽量晚上做这种事 。但是本人比较喜欢准时回家,所以在语句中添加Exception Handler,抛出anlyze index执行失败的那些index 名称,使脚本正常运行完毕 。并且根据打印到前台的index name手动执行那些index分析 。5. 总结 虽然发现522个index中有160个符合上面的判断的依据 。但是发现索引都不大 , 而那些拥有百万leaf的索引又没有符合上面的判断条件,所以结论是无需index rebuild online. 没有啥碎片 。6.什么时候可以rebuild index呢? rebuild index online , 对那些有大量DML操作的大索引是有益的 。可以每个月季度做一次针对较大索引的rebuild 。
oracle给表加索引怎么判断查询效率吗1、可以通过使用ExplainPlan分析工具来评估查询效率 。
2、ExplainPlan分析工具可以根据SQL查询语句执行步骤,计算出每一步的执行时间和代价 。
3、每一步所使用索引信息 , 从而帮助开发者判断是否需要为表添加索引,或者需要改善索引的性能 。
关于oracle如何改善索引和oracle 索引改名的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读