Sql 在Oracle中的联接(连接)表上创建索引

Sql 在Oracle中的联接(连接)表上创建索引,sql,oracle,indexing,Sql,Oracle,Indexing,很抱歉问了这么简单的问题,但我问了几个人,得到了不同的答案 我有一个由两列组成的联接表:(aID,bID) aID是表a的外键,bID是表B的外键 aID和bID一起是联接表的主键 下面哪种方法更有效地在联接表上创建索引 在(援助、投标)上创建唯一索引 在(aID、bID)上创建一个唯一索引,并创建两个单独的索引 关于援助和投标 为aID和bID创建单独的索引 以上都没有(建议你自己做) TL;DR 在(aID,bID)上不需要索引-因为它是主键,所以已经添加了唯一索引 如果对bID的单独

很抱歉问了这么简单的问题,但我问了几个人,得到了不同的答案

我有一个由两列组成的联接表:
(aID,bID)

  • aID是表a的外键,bID是表B的外键

  • aID和bID一起是联接表的主键

下面哪种方法更有效地在联接表上创建索引

  • 在(援助、投标)上创建唯一索引
  • 在(aID、bID)上创建一个唯一索引,并创建两个单独的索引 关于援助和投标
  • 为aID和bID创建单独的索引
  • 以上都没有(建议你自己做)
  • TL;DR

    • (aID,bID)
      上不需要索引-因为它是主键,所以已经添加了唯一索引
    • 如果对
      bID
      的单独查询在您的使用中很常见,例如像
      这样的过滤器,其中bID=123
    • 仅考虑
      aID
      上的索引也可能有轻微的优点(特别是如果
      bID
      不是狭义类型)
    但与所有索引一样,您需要知道数据是如何写入和访问的,以便为所有数据库使用者优化性能

    更多细节

    我应该在(援助、投标)上创建唯一索引吗

    不,如果
    (aID,bID)
    上已经有主键,Oracle已经有了主键,因此这里的进一步索引将是多余的

    我应该为援助和投标创建单独的索引吗

    每个外键列(独立)都有一个to,但是,可能有(非常)几种情况下,这是多余的或无效的,例如,您永远不会按外键进行筛选,或者外键没有选择性

    因此,深入研究每一个问题:

    援助

    可能不会。因为主键是
    (aid,bid)
    ,所以已经有了一个索引,第一列是
    aid
    ,尽管没有仅是
    aid
    的索引那么密集

    出价

    可能是的。虽然是唯一索引的一部分,
    bID
    是第二列,但是如果您经常在单独使用
    bID
    的情况下进行查询(即在没有
    aID
    的情况下进行查询),则唯一索引将不会有帮助。但是不要索引
    bId
    ,如果它不是与
    aID
    单独使用,并且根据所有索引,如果
    bId
    的选择性较低(例如
    bId
    只有两个不同的值,每个值都有50%的分布),那么索引就毫无价值

    其他注意事项

    索引需要熟悉数据库的使用情况-需要仔细考虑新索引,需要分析现有索引的冗余性(是否正在使用它们?是否有足够的类似索引?)和有效性(我使用索引的查询速度要快多少?)


    此外,是否添加多个或少个索引的决定还取决于读写的偏差-更多索引会增加写入的I/O和磁盘开销,但这可能不是一个问题,例如在每天重建一次的报表服务器上。

    使用hadoop!(说真的,这是一个愚蠢的问题。未知数太多了。取决于您将如何处理表)在连接表上-使用复合唯一键而不是两个索引不是更好吗?这样我们就有了索引+没有重复?我不确定复合索引是否能像两个单独的索引一样有效。这正是我在这个答案中试图说的,@WitoldKaczurba,因为复合主键(aID,bID)。Oracle将自动创建此复合键的唯一索引。这个相同的唯一索引也可以(相对地)单独用于
    aID
    列上的查询。但是,如果单独对
    bID
    进行查询,例如
    其中bID=xxx
    ,则需要对
    bID
    进行单独的二级索引,前提是对
    bID
    有足够的选择性,这才有意义。谢谢@StuartLC。向上投票:)。