在SQL Server中,您可以编写
create index indx on T1 (A,B) INCLUDE (C,D,E)
有没有办法在Oracle中做同样的事情?
答案 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;