以下是详细信息: -
表:
tableA
专栏:
columnA, columnB
查询:
Select * from tableA where columnA = columnB
我想在Oracle数据库中为where子句“columnA = columnB”创建索引,是否可以这样做?
答案 0 :(得分:2)
在Oracle中创建索引的查询:
CREATE INDEX idx ON test(id)
TABLESPACE idxs_indx;
哪里
idx
是索引的名称test
是表名id
是列名称idxs_indx
是表空间名称如果要将所有索引存储在单独的表空间中,则需要表空间名称。否则你可以使用查询:
CREATE INDEX idx ON test(id);
要查看创建的索引,可以使用以下查询:
select * from all_ind_column where table_name = 'test';
对于你的问题,我相信答案是这样的:
create index idx on test(id) where columnA=columnB;
如果有效,请告诉我。
答案 1 :(得分:1)
我认为,以下链接可能有助于实现您想要的目标
http://dba-presents.com/index.php/oracle/41-filtered-index-equivalent-in-oracle
Does Oracle have a filtered index concept?
答案 2 :(得分:0)
希望它能帮到你^^
创建基于函数的索引
基于函数的索引便于查询限定函数或表达式返回的值。函数或表达式的值已预先计算并存储在索引中。
除了创建常规索引的先决条件之外,如果索引基于用户定义的函数,那么这些函数必须标记为DETERMINISTIC。此外,如果这些函数归其他用户所有,则只需对基于函数的索引中使用的任何用户定义函数具有EXECUTE对象特权。
此外,要使用基于函数的索引:
创建索引后必须分析表格。
必须保证查询不需要索引表达式中的任何NULL值,因为NULL值不存储在索引中。
注意:强> CREATE INDEX存储基于函数的索引中使用的最新函数的时间戳。验证索引时会更新此时间戳。在执行基于函数的索引的表空间时间点恢复时,如果索引中使用的最新函数的时间戳比索引中存储的时间戳更新,则索引将标记为无效。您必须使用ANALYZE INDEX ... VALIDATE STRUCTURE语句来验证此索引。 要说明基于函数的索引,请考虑以下语句,该语句定义在函数区域(geo)上定义的基于函数的索引(area_index):
CREATE INDEX area_index ON rivers (area(geo));
在以下SQL语句中,当WHERE子句中引用area(geo)时,优化器会考虑使用索引area_index。
SELECT id, geo, area(geo), desc
FROM rivers
WHERE Area(geo) >5000;
表所有者应对基于函数的索引中使用的函数具有EXECUTE特权。
因为基于函数的索引依赖于它正在使用的任何函数,所以当函数更改时它可能会失效。如果该函数有效,则可以使用ALTER INDEX ... ENABLE语句来启用已禁用的基于函数的索引。 ALTER INDEX ... DISABLE语句允许您禁用基于函数的索引。如果您正在处理函数体
,请考虑这样做