sql – Oracle:索引表的行的子集

前端之家收集整理的这篇文章主要介绍了sql – Oracle:索引表的行的子集前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个表有活动的非活动条目,活动= 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;

猜你在找的MsSQL相关文章