85
--------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 952 | 7 (15)| 00:00:01 | |* 1 | HASH JOIN | | 14 | 952 | 7 (15)| 00:00:01 | | 2 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| EMP | 14 | 644 | 3 (0)| 00:00:01 | ---------------------------------------------------------------------------
#创建簇键 SQL> CREATE CLUSTER emp_dept (deptno NUMBER(3)) 2 SIZE 600 3 TABLESPACE users;
Cluster created. #创建簇表 先创建dept,然后再创建emp表。否则报错。 SQL> create table dept( 2 DEPTNO NUMBER(3) primary key, 3 DNAME VARCHAR2(14), 4 LOC VARCHAR2(13) 5 ) CLUSTER emp_dept (deptno);
Table created. #创建簇表 SQL> create table emp( 2 EMPNO NUMBER(4) primary key, 3 ENAME VARCHAR2(10), 4 JOB VARCHAR2(9), 5 MGR NUMBER(4), 6 HIREDATE DATE, 7 SAL NUMBER(7,2), 8 COMM NUMBER(7,2), 9 DEPTNO NUMBER(3) references dept(deptno) 10 ) CLUSTER emp_dept (deptno);
Table created. #创建簇索引 SQL> CREATE INDEX emp_dept_index 2 ON CLUSTER emp_dept 3 TABLESPACE users;
Index created. #插入数据 SQL> insert into dept select * from scott.dept;
4 rows created.
SQL> insert into emp select * from scott.emp;
14 rows created.
SQL> commit;
Commit complete. #查询两个表的rowid,rowid的前15位相同说明在同一个数据块中。 SQL> select e.rowid,d.rowid from emp e,dept d where e.deptno=d.deptno;
ROWID ROWID ------------------ ------------------ AAACgFAAEAAAACVAAA AAACgFAAEAAAACVAAB AAACgFAAEAAAACVAAB AAACgFAAEAAAACVAAC AAACgFAAEAAAACVAAC AAACgFAAEAAAACVAAC AAACgFAAEAAAACVAAD AAACgFAAEAAAACVAAB AAACgFAAEAAAACVAAE AAACgFAAEAAAACVAAC AAACgFAAEAAAACVAAF AAACgFAAEAAAACVAAC AAACgFAAEAAAACVAAG AAACgFAAEAAAACVAAA AAACgFAAEAAAACVAAH AAACgFAAEAAAACVAAB AAACgFAAEAAAACVAAI AAACgFAAEAAAACVAAA AAACgFAAEAAAACVAAJ AAACgFAAEAAAACVAAC AAACgFAAEAAAACVAAK AAACgFAAEAAAACVAAB
ROWID ROWID ------------------ ------------------ AAACgFAAEAAAACVAAL AAACgFAAEAAAACVAAC AAACgFAAEAAAACVAAM AAACgFAAEAAAACVAAB AAACgFAAEAAAACVAAN AAACgFAAEAAAACVAAA
14 rows selected.
#扫描方式发生变化 SQL> select e.empno,e.ename,e.sal,d.deptno,d.dname from emp e,dept d where e.deptno=d.deptno;
14 rows selected.
Execution Plan ---------------------------------------------------------- Plan hash value: 805422011
---------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 952 | 6 (0)| 00:00:01 | | 1 | NESTED LOOPS | | 14 | 952 | 6 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL | DEPT | 4 | 88 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS CLUSTER| EMP | 4 | 184 | 1 (0)| 00:00:01 | |* 4 | INDEX UNIQUE SCAN | EMP_DEPT_INDEX | 1 | | 0 (0)| 00:00:01 | ----------------------------------------------------------------------------------------
5.索引:
加快查询速度,索引第一次IO先访问树,到叶节点找到rowid,再通过rowid访问响应的记录。
6.索引组织表(IOT表):
可以将数据存放在索引的叶节点,不用再访问不同的段,iot表不能换查询条件,查询条件必须建成主键约束,如果换查询条件效率会很低。 iot表存储时根据主键排序进行存储,所以插入数据时,按顺序插入数据。 如果索引组织表中的数据放不下会把一些数据放到溢出表空间。 优点:只要io一次就能找到真实数据。 注意:生产中慎重使用。
例:将多对多的关系表创建索引组织表 SQL> create table students(stud_id number,fname varchar2(30),lname varchar2(30),constraint pk_student primary key(stud_id)); Table created.
SQL> create table classes(class_id number,cname varchar2(30),constraint pk_clas