当前位置:Gxlcms > 数据库问题 > 索引瘦身_oracle_11g

索引瘦身_oracle_11g

时间:2021-07-01 10:21:17 帮助过:31人阅读

> create table b as select * from dba_objects; SQL> select count(*) from b where status=INACTIVE; COUNT(*) ---------- 0 SQL> update b set status=INACTIVE where rownum=1; update b set status=INACTIVE where rownum=1 * ERROR at line 1: ORA-12899: value too large for column "TT"."B"."STATUS" (actual: 8, maximum: 7) SQL> alter table b modify STATUS varchar2(10); Table altered. SQL> update b set status=INACTIVE where rownum=1; 1 row updated. SQL> commit; Commit complete. SQL> create index cc_ind_status on b(case when STATUS=INACTIVE then 1 else null end); Index created. SQL> select count(*) from b where STATUS=INACTIVE; COUNT(*) ---------- 1 Execution Plan ---------------------------------------------------------- Plan hash value: 749587668 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 7 | 345 (1)| 00:00:05 | | 1 | SORT AGGREGATE | | 1 | 7 | | | |* 2 | TABLE ACCESS FULL| B | 14 | 98 | 345 (1)| 00:00:05 | --------------------------------------------------------------------------- select count(*) from b where (case when STATUS=INACTIVE then 1 else null end)=1; SQL> select count(*) from b where (case when STATUS=INACTIVE then 1 else null end)=1 COUNT(*) ---------- 1 Execution Plan ---------------------------------------------------------- Plan hash value: 1978997881 ----------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 3 | 1 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 3 | | | |* 2 | INDEX RANGE SCAN| CC_IND_STATUS | 1 | 3 | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access(CASE "STATUS" WHEN INACTIVE THEN 1 ELSE NULL END =1) Note ----- - dynamic sampling used for this statement (level=2)

二、对比大小

SQL> create index cc_ind_status_2 on b(status);

SQL>select SEGMENT_NAME,BYTES/1024/1024 from user_segments where SEGMENT_NAME like ‘CC_IND_STA%‘;

SEGMENT_NAME BYTES/1024/1024
-------------------- ---------------
CC_IND_STATUS       .0625
CC_IND_STATUS_2        2

SQL> analyze table b compute statistics;  

SQL> select INDEX_NAME,NUM_ROWS from user_indexes where INDEX_NAME like ‘CC_IND_STA%‘;

INDEX_NAME NUM_ROWS
------------------------------------------------------------ ----------
CC_IND_STATUS 1
CC_IND_STATUS_2 86341

 

索引瘦身_oracle_11g

标签:else   状态   comm   arc   oracle   bytes   优点   ble   altered   

人气教程排行