Oracle是否有过滤索引概念?

Mik*_*e Q 12 sql-server oracle filtered-index

与SQLServer类似,我可以执行以下操作

create index TimeSeriesPeriodSs1 on TimeSeriesPeriod (validationStatus, completionStatus)
where completionStatus= N'Complete'  
and  validationStatus= N'Pending'
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 14

您可以在Oracle中创建基于函数的索引,利用NULL值未存储在b树索引中的事实.就像是

CREATE INDEX TimeSeriesPeriodSs1
    ON TimeSeriesPeriod( 
          (CASE WHEN completionStatus = 'Complete' AND validationStatus = 'Pending'
                THEN validationStatus
                ELSE NULL
            END),
          (CASE WHEN completionStatus = 'Complete' AND validationStatus = 'Pending'
                THEN completionStatus
                ELSE NULL
            END)
       );
Run Code Online (Sandbox Code Playgroud)


Ale*_*ole 12

您可能可以为此使用基于函数的索引,但这种情况不是很令人满意:

create index TimeSeriesPeriodSs1 on TimeSeriesPeriod (
    case when validationStatus= N'Pending' and completionStatus= N'Complete' then validationStatus else null end,
    case when validationStatus= N'Pending' and completionStatus= N'Complete' then completionStatus else null end);
Run Code Online (Sandbox Code Playgroud)

您必须使查询的where子句完全匹配,以使其使用索引.

select <fields>
from TimeSeriesPeriod
where case when validationStatus= N'Pending' and completionStatus= N'Complete' then validationStatus else null end = N'Pending'
and case when validationStatus= N'Pending' and completionStatus= N'Complete' then completionStatus else null end = N'Complete';
Run Code Online (Sandbox Code Playgroud)

如果您可以定义(确定性)函数来执行此操作,那将会更加整洁case.请参阅此处获取更多信息和示例.或者,来自一个快速的谷歌.


Dav*_*sta 6

这是Justin和Alex的答案的一个小变体,它可以节省更多索引空间并使修改后的查询更具可读性IMO:

CREATE INDEX TimeSeriesPeriodSs1
    ON TimeSeriesPeriod( 
          (CASE WHEN completionStatus = 'Complete' AND validationStatus = 'Pending'
                THEN 1
                ELSE NULL
           END);

SELECT * FROM TimeSeriesPeriod
  WHERE 1 = (CASE WHEN completionStatus = 'Complete' AND validationStatus = 'Pending'
                THEN 1
                ELSE NULL
             END)
Run Code Online (Sandbox Code Playgroud)