oracle 存储过程批量重建索引

合集下载

oracle数据库创建索引例子

oracle数据库创建索引例子

oracle数据库创建索引例子Oracle数据库创建索引例子在Oracle数据库中,创建索引是优化查询性能的重要手段之一。

下面列举了一些创建索引的例子,并进行详细的讲解。

创建简单索引的例子1.创建唯一索引–语法:CREATE UNIQUE INDEX index_name ON table_name(column_name);–示例:创建一个名为idx_unique_id的唯一索引,索引字段为id,索引表为employees。

CREATE UNIQUE INDEX idx_unique_id ON employees(id);–说明:唯一索引保证了索引字段的值是唯一的,用于字段中不能存在重复值的情况。

2.创建普通索引–语法:CREATE INDEX index_name ONtable_name(column_name);–示例:创建一个名为idx_lastname的普通索引,索引字段为last_name,索引表为employees。

CREATE INDEX idx_lastname ON employee s(last_name);–说明:普通索引可以加快查询速度,适用于频繁查询的字段。

创建复合索引的例子3.创建复合唯一索引–语法:CREATE UNIQUE INDEX index_name ON table_name(column1, column2);–示例:创建一个名为idx_unique_name_dept 的复合唯一索引,索引字段为name和dept_id,索引表为employees。

CREATE UNIQUE INDEX idx_unique_name_d ept ON employees(name, dept_id);–说明:复合唯一索引是基于多个字段的唯一索引,可以保证多个字段组合的值是唯一的。

4.创建复合普通索引–语法:CREATE INDEX index_name ON table_name(column1, column2);–示例:创建一个名为idx_firstname_lastname的复合普通索引,索引字段为first_name和last_name,索引表为employees。

Oracle删除和重建由primary约束建立的索引

Oracle删除和重建由primary约束建立的索引

Oracle 删除和重建由primary 约束建立的索引drop index时出现如下错误:SQL> drop index oos_index;drop index oos_indexERROR at line 1:ORA-02429: cannot drop index used for enforcement ofunique/primary key我们知道当创建Primary key和unique约束时,如果在该key上不存在索引,则Oracle会自动创建对应的unique索引,而当你要删除该索引时,必须先Disable或Drop该约束。

看下面的例子:SQL>CREATE TABLE employees2 (3 empno NUMBER(6) PRIMARY KEY,4 name VARCHAR2(30),5 dept_no NUMBER(2)6 );Table created.SQL> select index_name,owner,table_NAME from all_indexes where owner=’SFA’ AND table_name=’EMPLOYEES’;INDEX_NAME OWNER TABLE_NAME———————- ——————- —————–SYS_C007594 SFA EMPLOYEESSQL> SELECTCONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,INDE X_NAME FROM ALL_CONSTRAINTS WHERETABLE_NAME=’EMPLOYEES’;CONSTRAINT_NAME C TABLE_NAME INDEX_NAME ———————————————————- ——————SYS_C007594 P EMPLOYEES SYS_C007594SQL> DROP INDEX SYS_C007594;DROP INDEX SYS_C007594*ERROR at line 1:ORA-02429: cannot drop index used for enforcement ofunique/primary keySQL> ALTER TABLE employees MODIFY PRIMARY KEY DISABLE;Table altered.SQL> select index_name,owner,table_NAME from all_indexes where owner=’SFA’ AND table_name=’EMPLOYEES’;no rows selected这时看到由约束建立的索引已经删除了。

oracle重建分区索引语句

oracle重建分区索引语句

oracle重建分区索引语句摘要:1.Oracle 分区索引简介2.重建分区索引的原因3.重建分区索引的步骤4.示例:使用SQL 语句重建分区索引正文:一、Oracle 分区索引简介Oracle 分区索引是一种在分区表上的索引,它可以提高查询效率。

分区索引与普通索引类似,但它是基于分区表的,因此具有更高的查询性能。

当数据量较大时,分区索引能够有效地减少查询数据的范围,提高查询速度。

二、重建分区索引的原因重建分区索引通常有以下原因:1.索引损坏:当分区索引损坏时,需要进行重建。

2.数据表分区改变:当数据表的分区发生变化时,需要重建分区索引以适应新的分区结构。

3.优化查询性能:在某些情况下,重建分区索引可以提高查询性能。

三、重建分区索引的步骤1.备份数据:在进行分区索引重建之前,需要备份数据以防止数据丢失。

2.使用ALTER INDEX 命令:使用ALTER INDEX 命令可以重建分区索引。

需要指定要重建的索引名称以及分区信息。

3.检查重建结果:重建完成后,需要检查重建结果以确保索引正确无误。

四、示例:使用SQL 语句重建分区索引以下是一个使用SQL 语句重建分区索引的示例:```sqlALTER INDEX index_nameREBUILD PARTITION p_number;```其中,`index_name`是要重建的分区索引名称,`p_number`是要重建的分区编号。

可以根据实际情况修改相应的参数值。

通过以上步骤和示例,可以完成Oracle 分区索引的重建工作。

在进行分区索引重建时,需要谨慎操作,确保数据安全。

oracle创建索引

oracle创建索引

Oracle创建索引Oracle在创建索引时要遵循以下的原则:●平衡查询和DML的需要。

在易挥发(DML操作频繁)的表上尽量减少索引的数量,因为索引虽然加快了查询的速度,但却降低了DML操作速度。

●将其放入单独的表空间,不要与表、临时段或还原(回滚)段放在一个表空间,因为索引段会与这些段竞争输入/输出(I/O)。

●使用统一的EXTENT尺寸:数据块尺寸的5倍,或表空间的MINIMUM EXTENT的尺寸。

这样做的目的是为了减少系统的转换时间。

●对大索引可以考虑使用NOLOGGING。

这样做的目的是通过减少REDO操作来提高系统的效率,但是如果一旦系统发生崩溃,则该索引一般是无法进行完全灰度的。

不过问题也不是很大,因为真正的数据还在表中,所以可以通过重建该索引来恢复与之前完全相同的效果。

●索引的INITRANS参数通常应该比相对应表的高。

以为索引项要比表中的数据行小的多,所以一个数据块可以存放更多的索引项(记录)。

创建索引的命令格式:CREA TE (UNIQUE|BITMAP) INDEX [用户名.]索引名ON [用户名.]表名(列名[ASC | DESC] [,列名[ASC| DESC ] ]…)[TABLESPACE 表空间名][PCTFREE 正整型数][INITRANS 正整型数][MAXTRANS 正整型数][存储子句][LOGGING | NOLOGGING][NOSORT]其中,●UNIQUE:说明该索引是唯一索引,默认是非唯一的●ASC:说明所创建的索引为升序●DESC:说明所创建的索引为降序●表空间名:说明将要创建的索引的表空间名●PCTFREE:在创建索引时每一个块中预留的空间●INITRANS:在每一个块中预分配的事物记录数,默认值为2●MAXTRANS:在每一个块中可以分配的事物记录数的上限,默认为255●存储子句:说明在索引中EXTENTS怎样分配●LOGGING:说明在创建索引是和以后的索引操作中要记录联机重做日志文件(默认)●NOLOGGING:说明索引的创建和一些数据装入操作将不记录联机重做日志文件●NOSORT:数据库中所存的数据行已经按升序排好,因此在创建索引时不需要再排序了●PCTUSED:在索引中不能说明该参数。

oracle重建索引

oracle重建索引

oracle重建索引⼀、重建索引的前提1、表上频繁发⽣update,delete操作;2、表上发⽣了alter table ..move操作(move操作导致了rowid变化)。

⼆、重建索引的标准1、索引重建是否有必要,⼀般看索引是否倾斜的严重,是否浪费了空间,那应该如何才可以判断索引是否倾斜的严重,是否浪费了空间,对索引进⾏结构分析(如下):SQL>Analyze index index_name validate structure;2、在执⾏步骤1的session中查询index_stats表,不要到别的session去查询。

SQL>select height,DEL_LF_ROWS/LF_ROWS from index_stats;说明:当查询出来的 height>=4 或者 DEL_LF_ROWS/LF_ROWS>0.2 的场合,该索引考虑重建。

举例: (t_gl_assistbalance 26 万多条信息 )SQL> select count(*) from t_gl_assistbalance ;输出结果:COUNT(*)----------265788SQL> Analyze index IX_GL_ASSTBAL_1 validate structure;Index analyzedSQL> select height,DEL_LF_ROWS/LF_ROWS from index_stats;输出结果:HEIGHT DEL_LF_ROWS/LF_ROWS---------- -------------------4 1三、重建索引的⽅式1、drop 原来的索引,然后再创建索引;举例:删除索引:drop index IX_PM_USERGROUP;创建索引:create index IX_PM_USERGROUP on T_PM_USER (fgroupid);说明:此⽅式耗时间,⽆法在24*7环境中实现,不建议使⽤。

重建索引语句

重建索引语句

重建索引语句
哎呀,你知道啥是重建索引语句不?就好比你有一个乱糟糟的书架,书放得乱七八糟,找起来特别费劲。

这时候重建索引语句就像是一个
神奇的整理大师,能把书架重新整理得井井有条,让你一下子就能找
到想要的书。

比如说,在一个庞大的数据库里,数据就像那一堆堆杂乱无章的书。

没有重建索引语句,要找个关键信息,那可真是难上加难!就像在黑
暗中摸索,半天都找不到方向。

想象一下,你在一个大型图书馆,找一本书找得焦头烂额。

这时候
要是有人能迅速把书架重新整理,让你轻松找到,那得多爽!重建索
引语句就是干这个的呀!
我的朋友小李,之前就因为数据库没有重建索引语句,工作效率那
叫一个低,天天抱怨。

后来用上了,他直呼“这简直是救星啊!”
所以说,重建索引语句可太重要啦!它能让数据的查找和使用变得
高效又轻松,谁能不爱呢?。

oracle索引,索引的建立、修改、删除

oracle索引,索引的建立、修改、删除

oracle索引,索引的建⽴、修改、删除索引,索引的建⽴、修改、删除2007-10-05 13:29 来源: 作者:⽹友评论 0 条浏览次数 2986索引索引是关系数据库中⽤于存放每⼀条记录的⼀种对象,主要⽬的是加快数据的读取速度和完整性检查。

建⽴索引是⼀项技术性要求⾼的⼯作。

⼀般在数据库设计阶段的与数据库结构⼀道考虑。

应⽤系统的性能直接与索引的合理直接有关。

下⾯给出建⽴索引的⽅法和要点。

§3.5.1 建⽴索引1. CREATE INDEX命令语法:CREATE INDEXCREATE [unique] INDEX [user.]indexON [user.]table (column [ASC | DESC] [,column[ASC | DESC] ] ... )[CLUSTER [scheam.]cluster][INITRANS n][MAXTRANS n][PCTFREE n][STORAGE storage][TABLESPACE tablespace][NO SORT]Advanced其中:schema ORACLE模式,缺省即为当前帐户index 索引名table 创建索引的基表名column 基表中的列名,⼀个索引最多有16列,long列、long raw列不能建索引列DESC、ASC 缺省为ASC即升序排序CLUSTER 指定⼀个聚簇(Hash cluster不能建索引)INITRANS、MAXTRANS 指定初始和最⼤事务⼊⼝数Tablespace 表空间名STORAGE 存储参数,同create table 中的storage.PCTFREE 索引数据块空闲空间的百分⽐(不能指定pctused)NOSORT 不(能)排序(存储时就已按升序,所以指出不再排序)2.建⽴索引的⽬的:建⽴索引的⽬的是:l 提⾼对表的查询速度;l 对表有关列的取值进⾏检查。

但是,对表进⾏insert,update,delete处理时,由于要表的存放位置记录到索引项中⽽会降低⼀些速度。

Oracle数据库在线重新重建索引

Oracle数据库在线重新重建索引

Oracle数据库在线重新重建索引
在日常数据库维护中,需要对索引进行一些维护工作。

其中一个工作就是索引的重建,索引重建对SQL的执行效率有影响,重建工作应慎重。

为了能快速重建索引,下面介绍一下在线重新建立索引的方法:SQL>alter session set workarea_size_policy=manual;
此步骤将PGA修改为手工模式。

SQL>alter session set sort_area_size=1073741824;
此步骤将排序区修改为1G
SQL>alter session set sort_area_retained_size=1073741824;
此步骤将用户排序区修改为1G
SQL>alter session set db_file_multiblock_read_count=128;
此步骤将多块读调整为128,增加单次数据读取量。

SQL>alter index <index_name> rebuild online parallel <2> compute statistics;
此步骤以并行(parallel)方式重新创建索引,并行度根据主机CPU资源闲置情况而定(同时参考启动参数parallel_max_servers)。

此语句同时进行优化统计信息的更新操作。

在线索引重建步骤不能中断,如果中断索引会处于一种不确定性。

SQL>alter index <index_name> noparallel;
此步骤,将取消重建好的索引的并行度,使其恢复正常。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

create o r r eplace p rocedure p_rebuild_all_index
(tablespace_name i n v archar2)
as
s qlt v archar(200);
begin
f or i dx i n(select i ndex_name, t ablespace_name, s tatus f rom u ser_indexes w here t ablespace_name =tablespace_name a nd s tatus='VALID'a nd t emporary='N') l oop
b egin
s qlt :='alter i ndex '||i dx.index_name ||'r ebuild ';
d bms_output.put_line(idx.index_name);
d bms_output.put_line(sqlt);
E XECUTE I MMEDIATE s qlt;
--错误后循环继续执行。

E XCEPTION
W HEN O THERS T HEN
d bms_output.put_line(SQLERRM);
e nd;
e nd l oop;
end;
declare
--表空间名称
t ablespace_name v archar2(100);
begin
t ablespace_name:='dddd';
p_rebuild_all_index(tablespace_name);
end;
方法2:
定期重建索引(oracle)文章来源:本站原创更新时间:2009-9-23 13:47:38
公司的所用的oracle数据库,因为数据增、删比较频繁,导致索引产生碎片,性能下降,并占用空间不能有效释放。

由于目前暂时找不到合适的DBA对数据库进行优化,于是写了一个简单的脚本来定期重建所有的索引。

本文提到的脚
本创建一张表用来记录索引重建的日志,建立一个存储过程,并建立一个job 来每7 天调用一次该存储过程。

声明:因为我不是DBA,个人感觉这个的方法不正规(不是best practice),仅供没有更好办法的时候参考。

-----------------------------------------
-- 因为系统中很对表的数据变化比较频繁,导致索引空间膨胀,系统性能下降-- 因此需要定期重建系统中的索引,以优化性能,回收空间
-- 这项维护性工作通过Oracle 的job 进行调度
-- 建立一张表,存放索引重建日志
CREATE TABLE tmMTNLog (
fLogDate char ( 19 ),
fLogMsg varchar2 ( 4000 )
);
-- 首先创建一个存储过程,该存储过程重建所有的索引
CREATE OR REPLACE procedure mtn_rebuild_all_idx
as
cursor indexCursor is
select * from user_indexes where table_owner = 'XXXXX' and index_type = 'NORMAL' ; --请将XXXXX替换为oracle用户名
indexRow indexCursor %ROWTYPE;
sqlText varchar2 ( 1024 );
begin
open indexCursor ;
loop
fetch indexCursor into indexRow ;
exit when indexCursor %NOTFOUND;
sqlText := ' alter index ' || indexRow . index_name || ' rebuild ' ;
BEGIN
execute immediate ( sqlText );
insert into tmMTNLog ( fLogDate , fLogMsg ) values( sysdate , 'rebuild index success:' || indexRow . index_name );
EXCEPTION
WHEN OTHERS THEN
insert into tmMTNLog ( fLogDate , fLogMsg ) values( sysdate , 'rebuild index fail:' || indexRow . index_name );
END;
end loop;
end;
/
-- 然后建立一个Oracle 任务,这个任务每隔七天调度一次mtn_rebuild_all_idx 这个存储过程
-- 请注意,Oracle 的任务创建脚本不能多次执行,因为每次执行都会生成一个新的任务,如果要修改,请先删除原有任务
-- 因为Oracle 中用编号表示任务,所以脚本不清楚该任务是否已经存在,无法做到自动删了新建
DECLARE
X NUMBER ;
BEGIN
SYS .DBMS_JOB.SUBMIT
(
job => X
, what => 'ITIMS.MTN_REBUILD_ALL_IDX;'
, next_date => TRUNC ( SYSDATE + 7 )
,interval => 'TRUNC(SYSDATE+7)'
, no_parse => FALSE
);
END;。

相关文档
最新文档