`
caihorse
  • 浏览: 140870 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

创建非唯一索引脚本的方法

阅读更多

导出创建非唯一索引脚本的方法

   在ORACLE里用逻辑备份工具exp导出数据时,如果使用默认参数, 会把索引一起导出来。当数据和索引小的时候,我们可能不
太会计较导入时间; 如果数据和索引大的时候,就应该考虑导入时间的问题了。

    实际地说,二进制dmp备份文件里有些索引对备份是用处不大的, 导出时完全可以选择indexes=n的参数, 不备份它们。这样
不仅可以缩短导入导出时间,还可以节省备份文件的存储空间。这种索引类型是非唯一(nounique)的。我们可以根据ORACLE数
据字典dba_indexes和dba_ind_columns里的信息生成创建索引的脚本。在导入完成后再运行这些创建索引的脚本。

    dba_indexes里记录了索引类型和存储参数等信息。
    dba_ind_columns里记录了索引的字段信息, 它的结构如下: 

SQL> desc dba_ind_columns;
 name                                   null?    type
 ----------------------------------------- -------- -------------------------
 index_owner                            not null varchar2(30)
 index_name                             not null varchar2(30)
 table_owner                            not null varchar2(30)
 table_name                             not null varchar2(30)
 column_name                                  varchar2(4000)
 column_position                        not null number
 column_length                          not null number
 descend                                        varchar2(4)

    column_name记录着有索引的字段, column_position标记着字段在创建索引时的位置, descend指索引的排序, 有asc和desc
两种,而desc排序方法用的较少,本文只考虑asc的情况。

    步骤一:先创建一个视图index_nouniq_column_num列出非系统用户nonunique索引的用户名, 索引名和字段数量。

SQL> create view index_nouniq_column_num as select t1.owner,t1.index_name,count(0) as column_num
from dba_indexes t1,dba_ind_columns t2 where t1.uniqueness='NONUNIQUE'
and instr(t1.owner,'sys')=0 and t1.owner=t2.index_owner and t1.index_name=t2.index_name
group by t1.owner,t1.index_name order by t1.owner,column_num;

    步骤二:为了处理方便,建一个索引字段临时表index_columns, 它的column_names记录了以逗号分隔,顺序排列的索引字段。

SQL> create table index_columns(
index_owner varchar2(30) not null,
index_name varchar2(30) not null,
column_names varchar2(512) not null)
  tablespace users;

    步骤三:把只有一个字段的索引内容插入索引字段临时表index_columns。

SQL> insert into index_columns select t1.owner,t1.index_name,t2.column_name from
index_nouniq_column_num t1,dba_ind_columns t2
where t1.column_num=1 and t1.owner=t2.index_owner and t1.index_name=t2.index_name
order by t1.owner,t1.index_name;
SQL> commit;

    步骤四:把多个字段的索引内容插入索引字段临时表index_columns。
            用到以下一个函数getcloumns和过程select_index_columns。

函数getcloumns:
create or replace function getcloumns(
index_owner1 in varchar2,
index_name1    in varchar2,
column_nums1 in number) return varchar2
is
     all_columns varchar2(512);
     total_num number;
     i number;
     cursor c1 is select column_name from dba_ind_columns where index_owner=index_owner1 and
      index_name=index_name1 order by column_position;
     dummy c1%rowtype;
begin
   total_num:=column_nums1;
   open c1;
   fetch  c1  into   dummy;
   i:=0;
   while c1%found  loop
   i:=i+1;
   if (i=total_num) then
   all_columns:= all_columns||dummy.column_name;
   else
   all_columns:= all_columns||dummy.column_name||',';
   end if;
   fetch c1 into dummy;
   end loop;
   close c1;
   return all_columns;
exception
    when no_data_found then
   return all_columns;
end;
/

过程select_index_columns:
create or replace procedure select_index_columns
is
   all_columns varchar2(2000);
   cursor c1 is select * from index_nouniq_column_num where column_num>=2;
   dummy c1%rowtype;
begin
   open c1;
   fetch  c1  into   dummy;
   while c1%found  loop
      select getcloumns(dummy.owner,dummy.index_name,dummy.column_num) into all_columns from dual;
      insert into index_columns values(dummy.owner,dummy.index_name,all_columns);
   fetch c1 into dummy;
   end loop;
   commit;
   close c1;
exception
   when others then 
   rollback;
end;
/

SQL> exec select_index_columns;

    执行select_index_columns过程就可以把多个字段的索引内容插入索引字段临时表了。

    步骤五:最后运行create_now_index.sql,根据索引字段临时表index_columns和dba_indexes在路径/oracle_backup/log
下生成创建非唯一索引脚本create_index.sql。

create_now_index.sql内容:

set heading off;
set pagesize 5000;
truncate table index_columns;
-- 把多个字段的索引内容插入索引字段临时表
exec select_index_columns;
-- 把只有一个字段的索引内容插入索引字段临时表
insert into index_columns select t1.owner,t1.index_name,t2.column_name
from index_nouniq_column_num t1,dba_ind_columns t2
where t1.column_num=1 and t1.owner=t2.index_owner and t1.index_name=t2.index_name
order by t1.owner,t1.index_name;
commit;
spool /oracle_backup/log/create_index.sql;
SELECT 'CREATE INDEX '||t1.owner||'.'||t1.index_name|| chr(10) ||' ON '||t1.table_name||
' ('||column_names||')'|| chr(10) ||' TABLESPACE '||t1.tablespace_name|| chr(10) ||
' PCTFREE '||t1.pct_free || chr(10) ||' STORAGE (INITIAL '||t1.initial_extent||
' NEXT '||t1.next_extent||' PCTINCREASE '||t1.pct_increase||');'|| chr(10) || chr(10)
 FROM dba_indexes t1,index_columns t2
 WHERE t1.owner=t2.index_owner and t1.index_name=t2.index_name
 ORDER BY t1.owner, t1.table_name;
spool off;

分享到:
评论

相关推荐

    mysql中创建各种索引的语句整理.pdf

    添加UNIQUE(唯一索引) 添加INDEX(普通索引) 添加FULLTEXT(全文索引) 添加多列索引 ) mysql>ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, 、where条件...

    irs-master-index-file:Python脚本和文档,用于构建来自各种来源的非营利组织的主索引文件-python source file

    主索引文件旨在提供一种在单个位置跟踪和搜索所有非营利回报的方法,以提供有关其运营状态的一些基本报告和990报告。 对于非营利性IRS申请的每条记录,该数据将包含一行数据,包括修订后的申请和撤销记录。 预期...

    《10天掌握MongoDB》2012完整版.pdf[带书签]

    唯一索引 地理空间索引-创建1 地理空间索引-创建2 地理空间索引-$NEAR 地理空间索引-$WITHIN(BOX) 地理空间索引-$WITHIN(CENTER) 地理空间索引-$WITHIN(POLYGON) 地理空间索引-球形查找 查询计划 强制使用索引 实战...

    indexhelper:快速统计和分类书籍索引词的工具

    该Python脚本旨在吃掉您所有的书面单词,并在您的文本中减去最常见的英语单词吐出最常见的唯一单词。 按字母顺序。 这听起来像是一个索引,不是吗? 然后,人类可以使用这些原始信息,将其粘贴到他们最喜欢的Word文...

    SQL Server 2008管理员必备指南(超高清PDF)Part1

    8.3.3 创建非索引字表 8.3.4 管理非索引字表 8.3.5 创建和使用同义词库文件 第9章 管理SQL Server 2008的安全性 9.1 SQL Server 2008安全性概况 9.1.1 使用安全主体和安全对象 9.1.2 理解安全对象的权限 9.1.3 检查...

    SQL Server 2008管理员必备指南(超高清PDF)Part3

    8.3.3 创建非索引字表 8.3.4 管理非索引字表 8.3.5 创建和使用同义词库文件 第9章 管理SQL Server 2008的安全性 9.1 SQL Server 2008安全性概况 9.1.1 使用安全主体和安全对象 9.1.2 理解安全对象的权限 9.1.3 检查...

    SQL Server 2008管理员必备指南(超高清PDF)Part2

    8.3.3 创建非索引字表 8.3.4 管理非索引字表 8.3.5 创建和使用同义词库文件 第9章 管理SQL Server 2008的安全性 9.1 SQL Server 2008安全性概况 9.1.1 使用安全主体和安全对象 9.1.2 理解安全对象的权限 9.1.3 检查...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    在创建表时,经常会创建该表的主键、外键、唯一约束、Check约束等  语法结构 create table 表名( [字段名] [类型] [约束] ……….. CONSTRAINT fk_column FOREIGN KEY(column1,column2,…..column_n) ...

    SQL.Server.2008管理员必备指南.part2.rar(2/4)

     8.3.3 创建非索引字表 220  8.3.4 管理非索引字表 222  8.3.5 创建和使用同义词库文件 223  第9章 管理SQL Server 2008的安全性 227  9.1 SQL Server 2008安全性概况 227  9.1.1 使用安全主体和安全对象 228 ...

    SQL.Server.2008管理员必备指南.part1.rar(1/4)

     8.3.3 创建非索引字表 220  8.3.4 管理非索引字表 222  8.3.5 创建和使用同义词库文件 223  第9章 管理SQL Server 2008的安全性 227  9.1 SQL Server 2008安全性概况 227  9.1.1 使用安全主体和安全对象 228 ...

    SQL.Server.2008管理员必备指南.part3.rar(3/4)

     8.3.3 创建非索引字表 220  8.3.4 管理非索引字表 222  8.3.5 创建和使用同义词库文件 223  第9章 管理SQL Server 2008的安全性 227  9.1 SQL Server 2008安全性概况 227  9.1.1 使用安全主体和安全对象 228 ...

    SQL.Server.2008管理员必备指南.part4.rar(4/4)

     8.3.3 创建非索引字表 220  8.3.4 管理非索引字表 222  8.3.5 创建和使用同义词库文件 223  第9章 管理SQL Server 2008的安全性 227  9.1 SQL Server 2008安全性概况 227  9.1.1 使用安全主体和安全对象 228 ...

    Splunk_智能运维实战(高清带详细目录书签)

    第9章介绍Splunk中的更多数据汇总方法:汇总索引和报表加速;第10章介绍如何自定义Splunk应用程序并使用Splunk SDK和API的高级特性来处理Splunk内的数据。 目录 译者序 前言 第1章 游戏时间——导入数据 1 1.1 ...

    SQL Server 2008编程入门经典(第3版)

    5.5.2 回到代码:使用MariagementStudio创建脚本的基础知识 5.6 本章小结 5.7 练习 第6章 约束 6.1 约束的类型 6.1.1 域约束 6.1.2 实体约束 6.1.3 参照完整性约束 6.2 约束命名 6.3 键约束 6.3.1 主键约束 6.3.2 ...

    Mysql数据库课程设计作业-学生选课

    这是使用Mysql数据库实现的学生选课课程作业,包含数据库脚本、要求及说明。 假设:每个教师在学校都有唯一的名字,每门课程只分配给一名教师。 1. 根据上面的表设计模式,确保所有模式都在3NF.2中。...创建专业索引。

    Mysql数据库课程设计作业-教师课程管理

    这是使用Mysql数据库实现的教师课程管理课程作业,包含数据库脚本、要求及说明文档。具体内容如下: 每个教师在学校都有唯一的名字,每门课程只分配给一名教师。 1. 根据上面的表设计模式,确保所有...创建专业索引。

    SQL.Server.2008编程入门经典(第3版).part1.rar

    创建和修改表的方法 数据库范式的多种形式 编写脚本和使用存储过程的技巧 索引的优缺点 锁和死锁对系统性能的各种影响 理解触发器及其使用方式 《SQL Server 2008编程入门经典(第3版)》读者对象 《SQL Server 2008...

    SQL.Server.2008编程入门经典(第3版).part2.rar

    创建和修改表的方法 数据库范式的多种形式 编写脚本和使用存储过程的技巧 索引的优缺点 锁和死锁对系统性能的各种影响 理解触发器及其使用方式 《SQL Server 2008编程入门经典(第3版)》读者对象 《SQL Server 2008...

Global site tag (gtag.js) - Google Analytics