【问题标题】:INCLUDE equivalent in Oracle包括 Oracle 中的等价物
【发布时间】:2011-07-03 18:42:08
【问题描述】:

在SQL server中你可以写

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

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

【问题讨论】:

  • 可能有助于更详细地解释在 SQL Server 中执行此操作的含义。知道如何在 Oracle 中做同样事情的人可能根本不知道 SQL Server。
  • "指定要添加到非聚集索引的叶级别的非键列。"在此处查看第二个答案:stackoverflow.com/questions/5108064/join-takes-too-long
  • 据我所知,Oracle 仅支持索引、复合索引和基于函数的索引(这是大多数 DBA IME 所厌恶的)。
  • 10g企业。是的,我认为你是对的,我可能需要用 A 和 B 移动 C、D、E。

标签: sql-server oracle indexing


【解决方案1】:

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

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

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

如果列很长 varchars,Oracle 可能无法建立索引。这有时被称为“覆盖”索引,我已经多次使用或看到它。

【讨论】:

  • 查看我的答案以了解 SQL Server 索引中包含的列
  • 从技术上讲,Oracle 中的任何索引都是唯一索引(如果索引未声明为唯一,则使用 ROWID)。因此,它不能真正索引分支中的 A,B,ROWID 并在叶块中具有 A,B,C,D,E,ROWID,因为顺序会不一致。
  • 如果要求是 (a,b) 上的唯一索引,则此操作失败 - 包括索引定义中的 C、D、E 然后允许重复的 a、b 记录。
  • @Andrew,是的,但是您可以在 (A, B) 上定义唯一键约束,Oracle 将使用 (A, B, C, D, E) 索引来强制执行它,甚至如果它不是唯一索引。
【解决方案2】:

参考:
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 列引入的原因,否则就没有理由引入这个新特性。

【讨论】:

  • 感谢您的解释,有时很难在不了解幕后情况的情况下仅使用任何被接受的答案。
【解决方案3】:

您可以创建一个索引组织的表,并且只存储带有键的特定列。请注意,您没有列出要包含的列,您只列出了最后一个列,并且它包括了所有列。 (这似乎很奇怪,通常列顺序在 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;

【讨论】:

  • IOT 对于几乎所有访问都通过主键进行的中小型查找表来说非常有意义。这是我使用它们的唯一目的。 Richard 的链接包括分区 IOT 的示例,这意味着相当大的表。可能在某些应用程序中效果很好,而在其他应用程序中效果不佳 - 就像其他任何东西一样。
  • 不是说你的源表被修改的时候需要手动维护这个索引表吗?
  • @dsum:你说的是什么修改?如果您在谈论 DDL,那么据我所知,Oracle 将进行必要的更改,就好像只有一个对象一样。
  • @jonearles:抱歉,我在 Oracle 方面没有太多经验。我对您的“创建表”感到困惑,因为我不知道什么是索引组织表 (IOT)。在我阅读更多关于 IOT 的内容后,我可以看到使用 IOT 的优势。
  • Oracle中的IOT基本上是Sql Server中的primary key clustered
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 2011-07-14
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多