加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 06:50:23 所属栏目:MsSql教程 来源:网络整理
导读:我有一个表有活动的非活动条目,活动= 1表示活动,活动= 0表示不活动. 我在这个表上有各种索引,但我只需要为活动条目维护索引,因为应用程序只查询活动数据.需要保留非活动数据,因为它可以再次变为活动状态,但这通常仅通过批量更新完成,无论如何都不会使用索引.
我有一个表有活动的非活动条目,活动= 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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读