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.请参阅此处获取更多信息和示例.或者,这来自一个快速的谷歌.
这是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)
| 归档时间: |
|
| 查看次数: |
5958 次 |
| 最近记录: |