在 Oracle 中的连接(连接)上创建索引 Table
Creating indexes in Oracle on a Join (Junction) Table
很抱歉这个简单的问题,但我问过几个人并得到了不同的答案。
我有一个包含 2 列的联接 table:(aID,bID)
aID 是 table A 的外键,bID 是 table B
的外键
aID 和 bID 一起是连接的主键 table。
以下哪项是在连接上创建索引的更有效方法table?
- 在 (aID,bID) 上创建唯一索引。
- 在 (aID,bID) 上创建唯一索引并创建 2 个单独的索引
关于 aID 和 bID。
- 为 aID 和 bID 创建单独的索引。
- None 以上(建议您自己的)。
TL;DR
- 您不需要
(aID, bID)
上的索引 - 因为它是主键,所以已经添加了唯一索引。
- 如果
bId
上的孤立查询在您的使用中很常见,则您可能需要 bID
上的单独索引,例如像 WHERE bID = 123
这样的过滤器
- 仅在
aID
上考虑索引可能也有一点好处(特别是如果 bID
不是窄类型)。
但与所有索引一样,您需要了解数据的写入和访问方式,以便优化所有数据库使用者的性能。
更多详情
Should I create a unique index on (aID,bID).
不,如果 (aID, bID)
上已经有主键,Oracle 已经有主键 unique index,所以这里再多一个索引是多余的。
Should I Create separate indexes for aID and bID.
每个外键列(独立)都有一个 general rule of thumb to add an index,但是,在(非常)少数情况下,这可能是多余的或无效的,例如你永远不会被外键过滤,或者外键没有选择性。
所以深入每个:
aID ?
可能不会。因为主键是 (aid, bid)
,所以已经有一个以 aID
作为第一列的索引,尽管不如只有 aid
的索引那么密集。
bID ?
可能,是的。尽管唯一索引的一部分,bID
是第二列,因此如果您经常查询 bID
被单独使用(即在没有 [=14 的查询中),唯一索引将无济于事=] 也有)。但是,如果 bId
没有与 aID
分开使用,则不要索引 bId
,并且根据所有索引,如果 bID
具有低选择性(例如,[=11 只有 2 个不同的值) =],每个都有 50% 的分布)那么索引就毫无价值。
其他注意事项
索引需要深入了解您的数据库是如何使用的 - 需要仔细考虑新索引,并且需要分析现有索引的冗余(它们是否被使用?是否有类似的索引可以满足需求?)和有效性(我对索引的查询速度有多快?)。
此外,是否添加更多或更少索引的决定也将取决于读取与写入的偏差——更多的索引会增加 I/O 和写入的磁盘开销,但这可能不是一个问题例如在每天重建一次的报告服务器上。
很抱歉这个简单的问题,但我问过几个人并得到了不同的答案。
我有一个包含 2 列的联接 table:(aID,bID)
aID 是 table A 的外键,bID 是 table B
的外键
aID 和 bID 一起是连接的主键 table。
以下哪项是在连接上创建索引的更有效方法table?
- 在 (aID,bID) 上创建唯一索引。
- 在 (aID,bID) 上创建唯一索引并创建 2 个单独的索引 关于 aID 和 bID。
- 为 aID 和 bID 创建单独的索引。
- None 以上(建议您自己的)。
TL;DR
- 您不需要
(aID, bID)
上的索引 - 因为它是主键,所以已经添加了唯一索引。 - 如果
bId
上的孤立查询在您的使用中很常见,则您可能需要bID
上的单独索引,例如像WHERE bID = 123
这样的过滤器
- 仅在
aID
上考虑索引可能也有一点好处(特别是如果bID
不是窄类型)。
但与所有索引一样,您需要了解数据的写入和访问方式,以便优化所有数据库使用者的性能。
更多详情
Should I create a unique index on (aID,bID).
不,如果 (aID, bID)
上已经有主键,Oracle 已经有主键 unique index,所以这里再多一个索引是多余的。
Should I Create separate indexes for aID and bID.
每个外键列(独立)都有一个 general rule of thumb to add an index,但是,在(非常)少数情况下,这可能是多余的或无效的,例如你永远不会被外键过滤,或者外键没有选择性。
所以深入每个:
aID ?
可能不会。因为主键是 (aid, bid)
,所以已经有一个以 aID
作为第一列的索引,尽管不如只有 aid
的索引那么密集。
bID ?
可能,是的。尽管唯一索引的一部分,bID
是第二列,因此如果您经常查询 bID
被单独使用(即在没有 [=14 的查询中),唯一索引将无济于事=] 也有)。但是,如果 bId
没有与 aID
分开使用,则不要索引 bId
,并且根据所有索引,如果 bID
具有低选择性(例如,[=11 只有 2 个不同的值) =],每个都有 50% 的分布)那么索引就毫无价值。
其他注意事项
索引需要深入了解您的数据库是如何使用的 - 需要仔细考虑新索引,并且需要分析现有索引的冗余(它们是否被使用?是否有类似的索引可以满足需求?)和有效性(我对索引的查询速度有多快?)。
此外,是否添加更多或更少索引的决定也将取决于读取与写入的偏差——更多的索引会增加 I/O 和写入的磁盘开销,但这可能不是一个问题例如在每天重建一次的报告服务器上。