包含Oracle中的等效项

时间:2011-02-24 18:06:15

标签: sql-server oracle indexing

在SQL Server中,您可以编写

create index indx on T1 (A,B) INCLUDE (C,D,E) 

有没有办法在Oracle中做同样的事情?

3 个答案:

答案 0 :(得分:7)

只需将所有列放在索引中:

create index indx on T1 (A,B,C,D,E)

如果Oracle决定使用您的索引(例如,A和B在WHERE子句中),它将从索引中获取C,D和E的值。

如果列是非常长的varchars,Oracle可能无法构建索引。这有时被称为“覆盖”索引,我已经多次使用或看过它。

答案 1 :(得分:6)

参考文献:
http://msdn.microsoft.com/en-us/library/ms190806.aspx
http://www.dba-oracle.com/t_garmany_easysql_btree_index.htm

这里的答案是指出SQL Server Included列不在关键级别存储INCLUDED列,仅在叶级别存储。如果包含4列,它们将作为数据存储在叶级别的块中。

将它们作为复合索引的附加部分创建会将索引分解为更多级别。

作为综合指数(A,B,C)

  Level1   Level2   Leaf
           (Branch)
  A1
           B1
                    C1
           B2
                    C3
           B3
                    C6
                    C7
  A2

指数(A)包括(B,C)

  Level1    Leaf
  A1        B1,C1 | B2,C3 | B3,C6 | B3,C7
  A2        null,null

存储结构的差异(影响性能)是它们作为INCLUDED列引入的原因,否则就没有理由引入这个新功能。

答案 2 :(得分:4)

您可以创建索引组织表,并仅使用键存储特定列。请注意,您没有列出要包含的列,您只列出最后一列,它包括所有列。 (这似乎很奇怪,通常列顺序在SQL中无关紧要。)就个人而言,我认为索引组织表很奇怪且有太多限制,redcayuga的想法可能更好。

create table t1
(
    a number,
    b number,
    c number,
    d number,
    e number,
    f number,
    g number,
    primary key (a, b, c)
)
organization index
including e
overflow;