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)
- 如果对
的单独查询在您的使用中很常见,例如像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。向上投票:)。