【问题标题】:How to create index?如何创建索引?
【发布时间】:2015-11-28 16:56:24
【问题描述】:

这里是详细信息:-

表:

tableA

列:

columnA, columnB

查询:

Select * from tableA where columnA = columnB

我想在Oracle数据库中为这个where子句“columnA=columnB”创建索引,可以这样做吗?

【问题讨论】:

  • 你试过create index some_index on tablea (columna, columnb)吗?

标签: sql oracle indexing


【解决方案1】:

查询以在 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;

如果可行,请告诉我。

【讨论】:

  • create index idx on test(id) where columnA=columnB; 对 Oracle 无效
  • 它给出了什么异常?
  • 您似乎无法为符合特定条件的特定列创建索引。只能为列的所有值创建索引。
【解决方案2】:

希望对你有所帮助^^

创建基于函数的索引

基于函数的索引有助于对函数或表达式返回的值进行限定的查询。函数或表达式的值已预先计算并存储在索引中。

除了创建常规索引的先决条件外,如果索引基于用户定义的函数,则这些函数必须标记为 DETERMINISTIC。此外,如果这些函数由其他用户拥有,您只需对基于函数的索引中使用的任何用户定义函数拥有 EXECUTE 对象权限。

另外,使用基于函数的索引:

创建索引后必须对表进行分析。

必须保证查询不需要索引表达式中的任何 NULL 值,因为 NULL 值不存储在索引中。

注意: CREATE INDEX 存储基于函数的索引中使用的最新函数的时间戳。验证索引时会更新此时间戳。在对基于函数的索引执行表空间时间点恢复时,如果索引中使用的最新函数的时间戳比存储在索引中的时间戳更新,则该索引被标记为无效。您必须使用 ANALYZE INDEX...VALIDATE STRUCTURE 语句来验证该索引。 为了说明基于函数的索引,请考虑以下语句,该语句定义了在函数 area(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 语句允许您禁用基于函数的索引。如果您正在处理函数的主体,请考虑这样做

【讨论】:

  • 我看不出与这个问题有任何联系。没有提到函数“区域”,也没有提到使用该函数的表达式。
  • 对此很抱歉,但我给了他与他的问题相关的相同方式。不是完全完整的代码。
【解决方案3】:
猜你喜欢
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2012-11-26
  • 2020-05-23
  • 2015-08-27
  • 2013-08-20
相关资源
最近更新 更多