我有一个表有活动的非活动条目,活动= 1表示活动,活动= 0表示不活动.
我在这个表上有各种索引,但我只需要为活动条目维护索引,因为应用程序只查询活动数据.需要保留非活动数据,因为它可以再次变为活动状态,但这通常仅通过批量更新完成,无论如何都不会使用索引.
我注意到索引非活动条目(有越来越多的活动条目)占用相当多的空间.
在Oracle(10g)中有没有办法做这样的事情:
在tab(active,col1,col2,…,coln)上创建索引an_idx,其中active = 1?
以前的尝试:
我尝试使用基于函数的索引在active = 0时将第一列设置为null,如下所示:
在选项卡上创建索引an_idx(decode(active,1,null),coln)
但在这种情况下,Oracle似乎仍然会为非活动列编制索引.
解决方法
通过ACTIVE对表进行分区,创建本地索引,并使非活动分区的索引为UNUSABLE.这将消除索引非活动数据所花费的时间.
create table tab(active number,col1 number,col2 number,col3 number) partition by list(active) (partition tab_active values(1),partition tab_inactive values(0)); create index tab_index1 on tab(col1) local; alter index tab_index1 modify partition tab_inactive unusable;
但这种方法有一些潜在的缺点:
>并非所有类型的索引都不可用.
>在数据库中使用不可用的对象是不正常的.人们可能会抱怨或假设它是一个错误并重建它.
>某些操作(如truncate)将自动使索引再次可用.
在Oracle 12c中,您可以使用partial indexes完成此任务:
create table tab(active number,col3 number) partition by list(active) (partition tab_active values(1) indexing on,partition tab_inactive values(0) indexing off); create index tab_index1 on tab(col1) local indexing partial;