函数索引的存储

函数索引的存储

[@more@]

函数索引

做一个很有意思的试验:

SQL> create table t as select rownum a from all_objects where rownum < 11;

Table created

SQL> select table_name,column_name from user_tab_cols;

TABLE_NAME COLUMN_NAME

------------------------------ ------------------------------

T A

SQL> create index t_ind on t(a+100);

Index created

SQL> select table_name,column_name from user_tab_cols;

TABLE_NAME COLUMN_NAME

------------------------------ ------------------------------

T A

T SYS_NC00002$

这里可以看到表t多出来一个列SYS_NC00002$

SQL> select a, SYS_NC00002$ from t;

A SYS_NC00002$

---------- ------------

1 101

2 102

3 103

4 104

5 105

6 106

7 107

8 108

9 109

10 110

10 rows selected

从查询的结果可以看到这个列就是我们的函数索引的值。

SQL>

这是一个很有意思的事情,数据库已经将数值算出来了,究竟这些数值是放在哪里?

SQL> exec dbms_stats.gather_table_stats(user,'T');

PL/SQL procedure successfully completed

SQL> select table_name,blocks from user_tables where table_name='T';

TABLE_NAME BLOCKS

------------------------------ ----------

T 4

SQL> create index t_ind1 on t(rpad(to_char(a),4000,'*'));

Index created

SQL> select table_name,column_name from user_tab_cols where table_name='T';

TABLE_NAME COLUMN_NAME

------------------------------ ------------------------------

T A

T SYS_NC00002$

T SYS_NC00003$

SQL> select a, SYS_NC00002$, SYS_NC00003$ from t;

A SYS_NC00002$ SYS_NC00003$

---------- ------------ --------------------------------------------------------------------------------

1 101 1*******************************************************************************

2 102 2*******************************************************************************

3 103 3*******************************************************************************

4 104 4*******************************************************************************

5 105 5*******************************************************************************

6 106 6*******************************************************************************

7 107 7*******************************************************************************

8 108 8*******************************************************************************

9 109 9*******************************************************************************

10 110 10******************************************************************************

10 rows selected

SQL> exec dbms_stats.gather_table_stats(user,'T');

PL/SQL procedure successfully completed

SQL> select table_name,blocks from user_tables where table_name='T';

TABLE_NAME BLOCKS

------------------------------ ----------

T 4

在这里可以看到表并没有增加存储空间,但是这些数值会存放在哪里哪?收集一下信息可以看到这些数值是存放在索引上,但是在表上会有一个系统命名的列名。

SQL> select index_name ,leaf_blocks from user_indexes where table_name='T';

INDEX_NAME LEAF_BLOCKS

------------------------------ -----------

T_IND 1

T_IND1 10

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/222350/viewspace-909446/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/222350/viewspace-909446/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值