Oracle同一表空间可以建立两个同名的索引名

oracle同一表空间两个不同的用户可以建立两个同名的索引名,那当重建索引时如何指定重建的是哪个索引呢?另外重建索引rebuild后面可以跟一个表空间名,这是做什么用的呢?谢谢!

1) Oracle 数据库对象又称模式对象;数据库对象是逻辑结构的集合,最基本的数据库对象是表。
其他数据库对象包括:同义词,索引,序列,视图。
1.1 同义词是现有对象的一个别名。
简化SQL语句;隐藏对象的名称和所有者;提供对对象的公共访问。
同义词共有两种类型:私有同义词和公有同义词。
私有同义词只能在其模式内访问,且不能与当前模式的对象同名。
私有同义词语法:
CREATE SYNONYM emp FOR SCOTT.emp;--其中emp是SCOTT.emp 的别名,SCOTT 是模式名,emp是表明
公有同义词语法:
CREATE PUBLIC SYNONYM emp_syn FOR SCOTT.emp;--其中emp_syn 是 同义词名称
创建或替换现有的同义词:
CREATE OR REPLACE SYNONYM emp_syn FOR SCOTT.emp;-- OR REPLACE 是替换现有的同义词
删除同义词:
SQL DROP SYNONYM emp;
SQL DROP PUBLIC SYNONYM emp_syn;
1.2 序列
1.2.1序列是用于生成唯一、连续序号的对象;序列可以是升序的,也可以是降序的。
使用CREATE SEQUENCE语句创建序列:
SQL CREATE SEQUENCE toys_seq
START WITH 10
INCREMENT BY 10
MAXVALUE 2000
MINVALUE 10
NOCYCLE
CACHE 10;
注意:指定内存中预先分配的序号数 。
1.2.2访问序列:
通过序列的伪列来访问序列的值
NEXTVAL 返回序列的下一个值
CURRVAL 返回序列的当前值
SQL INSERT INTO toys (toyid, toyname, toyprice)
VALUES ( toys_seq.NEXTVAL, ‘TWENTY’, 25);
SQL INSERT INTO toys (toyid, toyname, toyprice)
VALUES ( toys_seq.NEXTVAL, ’MAGIC PENCIL’, 75);
--其中toys_seq.NEXTVAL指定序列的下一个值
SQL SELECT toys_seq.CURRVAL FROM dual;-- 检索序列的当前值
1.2.3更改和删除序列
使用ALTER SEQUENCE语句修改序列,不能更改序列的START WITH参数
SQL ALTER SEQUENCE toys_seq MAXVALUE 5000 CYCLE;
使用DROP SEQUENCE语句删除序列
SQL DROP SEQUENCE toys_seq;
1.3视图
1.3.1视图以经过定制的方式显示来自一个或多个表的数据;
视图可以视为“虚拟表”或“存储的查询”;
创建视图所依据的表称为“基表。”
视图的优点有:
提供了另外一种级别的表安全性;
隐藏的数据的复杂性;
简化的用户的SQL命令;
隔离基表结构的改变;
通过重命名列,从另一个角度提供数据。
1.3.2创建视图的语法:
CREATE [OR REPLACE] [FORCE] VIEW
view_name [(alias[, alias]...)]
AS select_statement
[WITH CHECK OPTION]
[WITH READ ONLY];

CREATE VIEW stud_view(是图表)
AS SELECT studno, studname, subno(字段)
FROM Stud_details(原始表);
使用 WITH CHECK OPTION 选项创建视图
CREATE OR REPLACE VIEW pause_view AS
SELECT * FROM order_master WHERE ostatus = 'p'
WITH CHECK OPTION CONSTRAINT chk_pv;
使用 ORDER BY 子句创建视图
CREATE OR REPLACE VIEW ord_ven AS
SELECT * FROM vendor_master ORDER BY venname;
创建带有错误的视图
CREATE FORCE VIEW ven AS
SELECT * FROM venmaster;
创建外联接视图
CREATE VIEW ven_ord_outj_view AS
SELECT vm.vencode, venname, orderno, odate, ostatus
FROM vendor_master vm, order_master om
WHERE vm.vencode = om.vencode(+);
或者
SELECT vm.vencode, venname, orderno, odate, ostatus
FROM vendor_master vm LEFT OUTER JOIN order_master om
ON vm.vencode = om.vencode;
1.3.3视图上的DML语句
在视图上也可以使用修改数据的DML语句,如INSERT、UPDATE和DELETE
视图上的DML语句有如下限制:
只能修改一个底层的基表;
来源:( - 数据库对象_一土林夕_新浪博客如果修改违反了基表的约束条件,则无法更新视图;
如果视图包含连接操作符、DISTINCT 关键字、集合操作符、聚合函数或 GROUP BY 子句,则将无法更新视图;
如果视图包含伪列或表达式,则将无法更新视图。
视图中可以使用单行函数、分组函数和表达式:
CREATE VIEW item_view AS
SELECT itemcode, LOWER(itemdesc) item_desc
FROM itemfile;
使用DROP VIEW语句删除视图
SQL DROP VIEW toys_view;
1.4索引
索引有各种类型,除了标准索引外,还有一些特殊类型的索引:
索引的类型:唯一索引、位图索引、组合索引、基于函数的索引、反向键索引。
创建标准索引:
SQL CREATE INDEX item_index ON itemfile (itemcode)
TABLESPACE index_tbs;
重建索引:
SQL ALTER INDEX item_index REBUILD;
删除索引:
SQL DROP INDEX item_index;
1.4.1唯一索引
唯一索引确保在定义索引的列中没有重复值
Oracle 自动在表的主键列上创建唯一索引
使用CREATE UNIQUE INDEX语句创建唯一索引:
SQL CREATE UNIQUE INDEX item_index
ON itemfile (itemcode);
1.4.2组合索引
组合索引是在表的多个列上创建的索引;
索引中列的顺序是任意的;
如果 SQL 语句的 WHERE 子句中引用了组合索引的所有列或大多数列,则可以提高检索速度。
SQL CREATE INDEX comp_index
1.4.3反向键索引
反向键索引反转索引列键值的每个字节;
通常建立在值是连续增长的列上,使数据均匀地分布在整个索引上;
创建索引时使用REVERSE关键字:
SQL CREATE INDEX rev_index
ON itemfile (itemcode) REVERSE;
SQL ALTER INDEX rev_index REBUID NOREVERSE;

1.4.4位图索引
位图索引适合创建在低基数列上;
位图索引不直接存储ROWID,而是存储字节位到ROWID的映射;
减少响应时间;
节省空间占用。
语法:
SQL CREATE BITMAP INDEX bit_index
ON order_master (orderno);
1.4.5索引组织表
索引组织表的数据存储在与其关联的索引中;
索引中存储的是行的实际数据,而不是ROWID;
基于主键访问数据;
CREATE TABLE 命令与 ORGANIZATION INDEX 子句一起用于创建索引组织表:
SQL CREATE TABLE ind_org_tab (
vencode NUMBER(4) PRIMARY KEY,
venname VARCHAR2(20)
)
ORGANIZATION INDEX;
普通表与索引组织表的比较:
普通表索引组织表
ROWID 唯一地标识行 主键唯一地标识行
隐式的 ROWID 列 没有隐式的 ROWID 列
基于 ROWID 的访问 基于主键的访问
顺序扫描返回所有行 完全索引扫描返回所有行,并按主键顺序排列
支持分区 不支持分区
1.4.6基于函数的索引
基于一个或多个列上的函数或表达式创建的索引
表达式中不能出现聚合函数
不能在LOB类型的列上创建
创建时必须具有 QUERY REWRITE 权限
SQL CREATE INDEX lowercase_idx
ON toys (LOWER(toyname));
SQL SELECT toyid FROM toys
WHERE LOWER(toyname)='doll';
1.4.7索引中的分区
可以将索引存储在不同的分区中
与分区有关的索引有三种类型:
局部分区索引 - 在分区表上创建的索引,在每个表分区上创建独立的索引,索引的分区范围与表一致;
全局分区索引 - 在分区表或非分区表上创建的索引,索引单独指定分区的范围,与表的分区范围或是否分区无关;
全局非分区索引 - 在分区表上创建的全局普通索引,索引没有被分。
1.4.8获取索引的信息
与索引有关的数据字典视图有:
USER_INDEXES - 用户创建的索引的信息;
USER_IND_PARTITIONS - 用户创建的分区索引的信息;
USER_IND_COLUMNS - 与索引相关的表列的信息。
SQL SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
FROM USER_IND_COLUMNS
ORDER BY INDEX_NAME, COLUMN_POSITION;
来源:( - 数据库对象_一土林夕_新浪博客
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-08-27
1. 重建索引的时候指定该索引的所有者既可区别不同用户的索引
2. 表空间名可以将该索引重建到指定的表空间中,可以理解为重建+移动
以下2个句子请看:
ALTER INDEX AAA.index1 rebuild tablespace CCC
ALTER INDEX BBB.index1 rebuild

第一句话重建用户AAA的索引index1,并将该所以放置到CCC表空间中(如果它原来就在那儿的话,就不会移动,只会重建)
第二句话是重建用户BBB的索引index1.

希望能帮助你,谢谢~~~本回答被提问者和网友采纳
第2个回答  2010-08-27
这是oracle体系结构所决定的。
oracle 所有的数据库对像都有一个所属用户,所以在某个用户下建立数据库对象,例如索引名字不可相同,但不同用户却是可以相同的。
数据库对象在创建时默认情况下其所属表空间为用户默认表空间(在创建用户时可以指定default tablespace,当然也可以不指定。则其默认表空间为system表空间。)
在创建索引时还可以指定额外的表空间做为索引存储空间。这样有利于提高数据库性能。一般用户在创建数据库进,一般情况下会建立还几个表空间,用于分别存储对象,如用户表空间,用于专门建立用户和表。索引表空间,用于给表创建索引。
第3个回答  2010-08-27
有意思的问题,期待答案中

不过说句实话,会有人在生产环境中建2个同名索引么??
相似回答