如何创建索引?
How to create index?
详情如下:-
Table:
tableA
列:
columnA, columnB
查询:
Select * from tableA where columnA = columnB
我想在 Oracle 数据库中为这个 where 子句 "columnA=columnB" 创建索引,可以吗?
希望对你有帮助^^
创建基于函数的索引
基于函数的索引有助于查询限定函数或表达式返回的值。函数或表达式的值被预先计算并存储在索引中。
除了创建常规索引的先决条件外,如果索引是基于用户定义的函数,那么这些函数必须被标记为DETERMINISTIC。此外,如果基于函数的索引中使用的任何用户定义函数由其他用户拥有,则您只拥有 EXECUTE 对象特权。
此外,要使用基于函数的索引:
table必须在创建索引后进行分析
必须保证查询不需要索引表达式中的任何 NULL 值,因为 NULL 值不存储在索引中。
注:
CREATE INDEX 存储在基于函数的索引中使用的最近函数的时间戳。验证索引时会更新此时间戳。在对基于函数的索引执行 table 空间时间点恢复时,如果索引中最近使用的函数的时间戳比索引中存储的时间戳更新,则索引被标记为无效。您必须使用 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;
Table 所有者应该对基于函数的索引中使用的函数具有 EXECUTE 权限。
因为基于函数的索引依赖于它正在使用的任何函数,所以当函数更改时它可能会失效。如果函数有效,您可以使用 ALTER INDEX...ENABLE 语句来启用已禁用的基于函数的索引。 ALTER INDEX...DISABLE 语句允许您禁用基于函数的索引。如果您正在处理函数的主体,请考虑这样做
在 Oracle 中创建索引的查询:
CREATE INDEX idx ON test(id)
TABLESPACE idxs_indx;
哪里
idx
是索引的名称
test
是 table 名字
id
是列名
idxs_indx
是table空间名称
如果要将所有索引存储在单独的table空间中,则需要table空间名称。否则你可以只使用查询:
CREATE INDEX idx ON test(id);
要查看创建的索引,可以使用以下查询:
select * from all_ind_column where table_name = 'test';
对于你的问题,我相信答案是这样的:
create index idx on test(id) where columnA=columnB;
如果可行,请告诉我。
我认为,以下链接可能有助于实现您想要的
http://dba-presents.com/index.php/oracle/41-filtered-index-equivalent-in-oracle
Does Oracle have a filtered index concept?
详情如下:-
Table:
tableA
列:
columnA, columnB
查询:
Select * from tableA where columnA = columnB
我想在 Oracle 数据库中为这个 where 子句 "columnA=columnB" 创建索引,可以吗?
希望对你有帮助^^
创建基于函数的索引
基于函数的索引有助于查询限定函数或表达式返回的值。函数或表达式的值被预先计算并存储在索引中。
除了创建常规索引的先决条件外,如果索引是基于用户定义的函数,那么这些函数必须被标记为DETERMINISTIC。此外,如果基于函数的索引中使用的任何用户定义函数由其他用户拥有,则您只拥有 EXECUTE 对象特权。
此外,要使用基于函数的索引:
table必须在创建索引后进行分析
必须保证查询不需要索引表达式中的任何 NULL 值,因为 NULL 值不存储在索引中。
注: CREATE INDEX 存储在基于函数的索引中使用的最近函数的时间戳。验证索引时会更新此时间戳。在对基于函数的索引执行 table 空间时间点恢复时,如果索引中最近使用的函数的时间戳比索引中存储的时间戳更新,则索引被标记为无效。您必须使用 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;
Table 所有者应该对基于函数的索引中使用的函数具有 EXECUTE 权限。
因为基于函数的索引依赖于它正在使用的任何函数,所以当函数更改时它可能会失效。如果函数有效,您可以使用 ALTER INDEX...ENABLE 语句来启用已禁用的基于函数的索引。 ALTER INDEX...DISABLE 语句允许您禁用基于函数的索引。如果您正在处理函数的主体,请考虑这样做
在 Oracle 中创建索引的查询:
CREATE INDEX idx ON test(id)
TABLESPACE idxs_indx;
哪里
idx
是索引的名称test
是 table 名字id
是列名idxs_indx
是table空间名称
如果要将所有索引存储在单独的table空间中,则需要table空间名称。否则你可以只使用查询:
CREATE INDEX idx ON test(id);
要查看创建的索引,可以使用以下查询:
select * from all_ind_column where table_name = 'test';
对于你的问题,我相信答案是这样的:
create index idx on test(id) where columnA=columnB;
如果可行,请告诉我。
我认为,以下链接可能有助于实现您想要的
http://dba-presents.com/index.php/oracle/41-filtered-index-equivalent-in-oracle
Does Oracle have a filtered index concept?