T ---------- ---------- --------- 3 PC3 17-FEB-02 8 PC8 13-FEB-02 8 PC8 13-FEB-13
#创建唯一索引 ,因为数据中id有重复,所以报错。 SQL> CREATE unique INDEX i_sales_id ON sales_history(id) GLOBAL 2 PARTITION BY HASH (id) 3 (PARTITION pi1 TABLESPACE users, 4 PARTITION pi2 TABLESPACE users, 5 PARTITION pi3 TABLESPACE users, 6 PARTITION pi4 TABLESPACE users) parallel 4;
CREATE unique INDEX i_sales_id ON sales_history(id) GLOBAL * ERROR at line 1: ORA-12801: error signaled in parallel query server P001 ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found
#根据rowid查询和删除重复数据: SQL> select a.* from sales_history a 2 where a.rowid in ( 3 select min(b.rowid) from sales_history b 4 where b.id=a.id);
ID NAME SALES_DAT ---------- ---------- --------- 7 PC7 11-FEB-98 4 PC4 17-FEB-99 1 PC1 17-FEB-00 5 PC5 15-FEB-00 2 PC2 17-FEB-01 6 PC6 12-FEB-01 3 PC3 17-FEB-02 8 PC8 13-FEB-02
8 rows selected. #查询出多余的数据 SQL> select a.* from sales_history a 2 where a.rowid not in ( 3 select min(b.rowid) from sales_history b 4 where b.id=a.id);
ID NAME SALES_DAT ---------- ---------- --------- 8 PC8 13-FEB-13
SQL> select a.*,rowid from sales_history a;
ID NAME SALES_DAT ROWID ---------- ---------- --------- ------------------ 7 PC7 11-FEB-98 AAACffAAEAAAAA9AAA 4 PC4 17-FEB-99 AAACfgAAEAAAABFAAA 1 PC1 17-FEB-00 AAACfhAAEAAAABNAAA 5 PC5 15-FEB-00 AAACfhAAEAAAABNAAB 2 PC2 17-FEB-01 AAACfiAAEAAAABVAAA 6 PC6 12-FEB-01 AAACfiAAEAAAABVAAB 3 PC3 17-FEB-02 AAACfjAAEAAAABdAAA 8 PC8 13-FEB-02 AAACfjAAEAAAABdAAB 8 PC8 13-FEB-13 AAACfjAAEAAAABdAAC
9 rows selected. #删除重复的数据 SQL> delete from sales_history a 2 where a.rowid not in ( 3 select min(b.rowid) from sales_history b 4 where b.id=a.id); SQL> CREATE unique INDEX i_sales_id ON sales_history(id) GLOBAL 2 PARTITION BY HASH (id) 3 (PARTITION pi1 TABLESPACE users, 4 PARTITION pi2 TABLESPACE users, 5 PARTITION pi3 TABLESPACE users, 6 PARTITION pi4 TABLESPACE users) parallel 4;
Index created.
注意:parallel 在生成库上慎重使用,可能会把cpu的资源消耗干。 注意:对某个字段已做了分区了,是不允许再建立索引分区的。这一点要非常注意。
#创建本地索引 SQL> CREATE INDEX i_sales_date on sales_history(sales_date) local;
Index created. #创建一个不分区的索引 SQL> CREATE INDEX i_sales_name on sales_history(name);
#查询索引,partitioned 为YES表示分区索引。 SQL> select index_name,index_type,table_name,tablespace_name,partitioned from dba_indexes where table_name='SALES_HISTORY';
INDEX_NAME INDEX_TYPE TABLE_NAME TABLESPACE PAR -------------------- ---------- -------------------- ---------- --- I_SALES_ID NORMAL SALES_HISTORY YES I_SALES_DATE NORMAL SALES_HISTORY YES I_SALES_NAME NORMAL SALES_HISTORY SYSTEM NO
#truncate 分区。 SQL> alter table sales_history truncate partition p2 update indexes; Table truncated.
#重建分区索引 SQL> alter index i_sales_date rebuild partition p3; Index altered.
#添加分区 SQL> alter table sales_history add partition p6 values less than (to_date('2019-01-01','yyyy-mm-dd')) ;
3.2. PARTITION BY REFERENCE: http://blog.itpub.net/9240380/viewspace-752307 http://docs.oracle.com/cd/E11882_01/server.112/e25523/part_admin001.htm#i1006455
4.簇表:
主要用于表和表之间的连接查询。 访问不同的表时要访问不同的段,磁盘会访问不同的磁道,如果两个表能存放到一个段,就能提高访问速度。 一个簇是由共享相同数据块的一组表组成,因为这些表共享公共的列并且经常一起被使用,所以将这些表组合在一起。 簇表优点: 减少了磁盘i/o并改善了访问簇表的连接所化的时间。 簇键是列或列的组,他们是簇表所共用的创建簇时指定簇键的列,
例:创建簇表 #关联查询 SQL> select e.empno,e.ename,e.sal,d.deptno,d.dname from scott.emp e,scott.dept d where e.deptno=d.deptno;
14 rows selected.
Execution Plan ---------------------------------------------------------- Plan hash value: 6151686