索引组织表

索引组织表   


    对于索引组织表必须有主键,问题它没有rowid,且只有逻辑rowid猜测到溢出部分。索引组织表可以进行分区,但只能是范围分区、散列分区、列表分区,但不能为复合分区。另外索引组织

表其实就是根据表的主键按照一定的顺序将数据表和索引进行了整合一张表,如果该字段过大,那么访问相关特定数据行就会出现穿越多个块,因此对于不经常访问的列归为溢出部分,如果

启用溢出部分需要使用overflow关键字,including字段指定该列之后的列都会放到溢出部分中,另外pctthreshold指定当该块数据达到一个标准值之后,那么其余部分将会放到溢出部分中。

SQL> create table locations_iot(
  2  location_id number(4) not null,
  3  street_address varchar2(40),
postal_code varchar2(12),
  4    5  city varchar2(20)
  6  )
  7  organization index; 
organization index
             *
ERROR at line 7:
ORA-25175: no PRIMARY KEY constraint found


SQL> create table locations_iot(
  2  location_id number(4) not null,
  3  street_address varchar2(40),
postal_code varchar2(12),
  4    5  city varchar2(20),
  6  constraint locations_iot_pk primary key(location_id)
  7  )
  8  organization index;

Table created.

SQL> create table locatios_iot(
  2  location_id number(4) not null,
  3  street_address varchar2(40),
  4  postal_code varchar2(12),
  5  city varchar2(20),
  6  constraint locatios_iot primary key(location_id,street_address)
  7  ) organization index
  8  partition by list(street_address)
  9  (
 10  partition part1 values('Happy','New','YEAR') tablespace test,
 11  partition part2 values('My','leadership','do','not','let','me','go','home') tablespace test
 12  );

Table created.

SQL> 



使用analyze table xxx list chained rows;确定pctthreshold设置是否合理。
出现表的链接记录和迁移记录的rowid都会保存到表chaind_rows中,但是该表必须提前创建,
eg:

SQL> @?/rdbms/admin/utlchain.sql

Table created.

SQL> select table_name from user_tables where table_name='CHAINED_ROWS';

TABLE_NAME
------------------------------
CHAINED_ROWS

SQL> analyze table t list chained rows;

Table analyzed.

SQL> select * from chained_rows;

no rows selected

SQL> 


 

注意在添加映射表或是overflow之后都会自动创建相关表:
eg:

SQL> alter table employees move mapping table;

Table altered.

SQL> select table_name,iot_name,iot_type from user_tables;                             

TABLE_NAME                     IOT_NAME                       IOT_TYPE
------------------------------ ------------------------------ ------------
SYS_IOT_MAP_87909              EMPLOYEES                      IOT_MAPPING
SYS_IOT_OVER_87909             EMPLOYEES                      IOT_OVERFLOW
EMPLOYEES                                                     IOT
ACHIVEMENT
ACHIVEEMENT
T_LIST
RANGE_LIST
RANGE_LIST_PARTITION
CHAINED_ROWS
EMP
SALGRADE

TABLE_NAME                     IOT_NAME                       IOT_TYPE
------------------------------ ------------------------------ ------------
DEPT

12 rows selected.

SQL> alter table employees move nomapping;

Table altered.


SQL> select table_name,iot_name,iot_type from user_tables;                             

TABLE_NAME                     IOT_NAME                       IOT_TYPE
------------------------------ ------------------------------ ------------
SYS_IOT_OVER_87909             EMPLOYEES                      IOT_OVERFLOW
EMPLOYEES                                                     IOT
ACHIVEMENT
ACHIVEEMENT
T_LIST
RANGE_LIST
RANGE_LIST_PARTITION
CHAINED_ROWS
EMP
SALGRADE
DEPT

11 rows selected.


SQL> alter table employees move mapping table;

Table altered.

SQL> select table_name,iot_name,iot_type from user_tables;

TABLE_NAME                     IOT_NAME                       IOT_TYPE
------------------------------ ------------------------------ ------------
SYS_IOT_MAP_87909              EMPLOYEES                      IOT_MAPPING
SYS_IOT_OVER_87909             EMPLOYEES                      IOT_OVERFLOW
EMPLOYEES                                                     IOT
ACHIVEMENT
ACHIVEEMENT
T_LIST
RANGE_LIST
RANGE_LIST_PARTITION
CHAINED_ROWS
EMP
SALGRADE

TABLE_NAME                     IOT_NAME                       IOT_TYPE
------------------------------ ------------------------------ ------------
DEPT

12 rows selected.

SQL> 


 


压缩索引组织表:
主要是值压缩复合主键列,如果主键设置为单列则无法进行压缩。
eg:

SQL> alter table employees move compress 1;      
alter table employees move compress 1
            *
ERROR at line 1:
ORA-25193: cannot use COMPRESS option for a single column key

SQL> SET PAGESIZE 2000
SQL> R
  1* SELECT DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES','AMY') FROM DUAL

DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES','AMY')
--------------------------------------------------------------------------------

  CREATE TABLE "AMY"."EMPLOYEES"
   (    "EMPLOYEE_ID" NUMBER(6,0),
        "FIRST_NAME" VARCHAR2(20),
        "LAST_NAME" VARCHAR2(25),
        "EMAIL" VARCHAR2(24),
        "PHONE_NUMBER" VARCHAR2(20),
        "HIREE_DATE" DATE,
         CONSTRAINT "EMPLOYEES_PK" PRIMARY KEY ("EMPLOYEE_ID") ENABLE
   ) ORGANIZATION INDEX NOCOMPRESS PCTFREE 10 INITRANS 2 MAXTRANS 255 LOGGING
  STORAGE(INITIAL 163840 NEXT 163840 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TEST"
 PCTTHRESHOLD 40 MAPPING TABLE  INCLUDING "LAST_NAME" OVERFLOW
 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING
  STORAGE(INITIAL 163840 NEXT 163840 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TEST"


SQL> DROP TABLE EMPLOYEES;

Table dropped.

SQL> PURGE RECYCLEBIN;

Recyclebin purged.

SQL> CREATE TABLE "AMY"."EMPLOYEES"
  2     (    "EMPLOYEE_ID" NUMBER(6,0),
  3          "FIRST_NAME" VARCHAR2(20),
  4          "LAST_NAME" VARCHAR2(25),
  5          "EMAIL" VARCHAR2(24),
  6          "PHONE_NUMBER" VARCHAR2(20),
  7          "HIREE_DATE" DATE,
  8           CONSTRAINT "EMPLOYEES_PK" PRIMARY KEY ("EMPLOYEE_ID","FIRST_NAME") ENABLE
  9     ) ORGANIZATION INDEX NOCOMPRESS PCTFREE 10 INITRANS 2 MAXTRANS 255 LOGGING
 10    STORAGE(INITIAL 163840 NEXT 163840 MINEXTENTS 1 MAXEXTENTS 2147483645
 11    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
 12    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
 13    TABLESPACE "TEST"
 14   PCTTHRESHOLD 40 MAPPING TABLE  INCLUDING "LAST_NAME" OVERFLOW
 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING
 15   16    STORAGE(INITIAL 163840 NEXT 163840 MINEXTENTS 1 MAXEXTENTS 2147483645
 17    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
 18    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
 19    TABLESPACE "TEST";

Table created.

SQL> ALTER TABLE EMPLOYEES MOVE COMPRESS 1;

Table altered.



创建二级位图索引:‘

SQL> 
SQL> ALTER TABLE EMPLOYEES MOVE MAPPING TABLE;

Table altered.

SQL> DESC EMPLOYEES;
 Name                                                                                                              Null?    Type
 ----------------------------------------------------------------------------------------------------------------- -------- 

----------------------------------------------------------------------------
 EMPLOYEE_ID                                                                                                       NOT NULL NUMBER(6)
 FIRST_NAME                                                                                                        NOT NULL VARCHAR2(20)
 LAST_NAME                                                                                                                  VARCHAR2(25)
 EMAIL                                                                                                                      VARCHAR2(24)
 PHONE_NUMBER                                                                                                               VARCHAR2(20)
 HIREE_DATE                                                                                                                 DATE


SQL> CREATE BITMAP INDEX EMPLOYEES_BTIDX1 ON EMPLOYEES(LAST_NAME);

Index created.

SQL> 



由于时间之后索引组织表可能存在叶块分裂导致逻辑猜测rowid不准确,需要重新调整索引:

住:查看二级索引是否会导致物理猜测不准确可以通过查看user_indexes的pct_direct_access如果该值低于100说明二级索引存在迁移物理估算不够准确,低于80那么就存在很严重的性能问题了


重建索引组织表:
使用alter table move操作,如果是在线不会防止其他 访问应该使用online字,但是如果是分区索引组织表,那么只能通过user_tab_partitions获得分区名在对每个分区进行move
alter table employees move online;
alter table employees move partition part1;

查看索引组织表信息:
select a.table_name,
       a.index_name,
       a.index_type,
       a.pct_threshold,
       nvl(column_name, 'NONE') include_column
  from user_indexes a
  join user_tab_columns b
    on (a.table_name = b.table_name)
   and (a.include_column = b.column_id)
 where index_type = 'IOT - TOP';

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值