连接表是否应该创建为索引组织表(Clustered Indexes)?

vic*_*csz 6 sql-server oracle indexing clustered-index

一般来说......应该将连接表(即关联表)创建为索引组织表(Oracle),聚簇索引(SQL Server)....或普通旧堆表(在2列上具有单独的索引).

我看的方式,优点是:

速度提升.你正在避免堆表查找.

空间改善.你完全取消了堆表,所以你可能节省了大约30%的空间.

缺点:

索引跳过扫描(仅适用于Oracle)..将比全表扫描更快,但比索引扫描慢.因此,对复合键的第二列的搜索将稍微慢一点(Oracle),慢得多(MSSQL).

完整索引扫描将比全表扫描慢 - 所以如果大多数时候基于成本的优化器正在进行哈希联接(不利用索引)......你可能会期望性能更差.(假设RDBMS不首先过滤表).

这让我怀疑,如果您主要要做Hash Joins,那么Join Tables是否真的需要任何类型的索引.

Ada*_*sch 3

我个人的经验法则是创建两个表关联实体作为索引组织表,主键约束是我希望更常用的访问“方向”。然后,我通常会添加一个唯一索引来覆盖键的相反顺序,因此在所有情况下优化器都应该能够使用唯一扫描或范围扫描访问。

三表(或更多)关联实体通常需要更多的分析。

此外,优化器将使用带有哈希连接操作的索引;通常完整扫描速度很快,但仍然有索引。