【发布时间】:2012-01-31 12:32:46
【问题描述】:
一般来说...应该将连接表(即关联表)创建为索引组织表(Oracle)、聚集索引(SQL Server)...或普通的旧堆表(在 2 列上有单独的索引) .
我看的方式,优点是:
速度提升。 您正在避免查找堆表。
空间改善。 您完全消除了堆表,因此您可能节省了大约 30% 的空间。
缺点:
索引跳过扫描(仅适用于 Oracle).. 会比全表扫描快,但比索引扫描慢。因此,在复合键的第二列上的搜索会稍微慢一些(Oracle),慢得多(MSSQL)。
全索引扫描会比全表扫描慢 - 因此,如果基于成本的优化器大部分时间都在执行哈希连接(不利用索引)......您可能会遇到更差的性能。 (假设 RDBMS 不首先过滤表)。
如果您主要进行哈希连接,这让我怀疑连接表是否真的需要任何类型的索引。
【问题讨论】:
-
你应该在两列上有一个复合主键,无论如何都会在它们上创建一个唯一索引。
-
reg "全索引扫描会比全表扫描慢":Oracle 也有 INDEX FAST FULL SCAN,它基本上和全表访问一样快。见use-the-index-luke.com/sql/explain-plan/oracle/…。另请参阅我的评论 reg。下面是哈希连接索引。
-
@MarkusWinand - 好点...感谢伟大的网站(IMO 它是在线索引上最简洁的 dbms 不可知源)。
标签: sql-server oracle indexing clustered-index