J. Mini Asked: 2024-10-10 18:54:41 +0800 CST2024-10-10 18:54:41 +0800 CST 2024-10-10 18:54:41 +0800 CST 如果我们始终可以强制进行哈希连接,那么堆连接是否会引起性能问题? 772 我显然有一个误解,但无论多少咨询文档都无法解决这个问题。考虑以下论点: 我们通常担心加入堆,因为对它们进行排序通常比拥有聚集索引更昂贵。 哈希连接不需要排序。 从上面我们得出结论,如果您始终可以获得(或强制)哈希连接,那么您就不必担心加入堆。 大众对堆的鄙视表明上述说法是错误的,但错在哪里呢? sql-server 1 个回答 Voted Best Answer J.D. 2024-10-10T20:42:16+08:002024-10-10T20:42:16+08:00 大众对堆的鄙视表明上述说法是错误的,但错在哪里呢? 这是错误的: 从上面我们得出结论,如果您始终可以获得(或强制)哈希连接,那么您就不必担心加入堆。 仅仅因为您不需要对堆进行排序并不意味着您不会从对其进行过滤或其他一些排序查找会更快的操作中受益。如果无法在计划中更早地应用过滤操作并且最终扫描整个堆,则您可能会冒着散列整个表的风险。 有了聚集索引,至少可以更高效地查找或扫描,从而减少计划早期操作的数据量。然后,散列后的数据集会小得多,从而使操作更快、更高效。 至少这是一个例子。 另一个更简单的原因是,您不应该总是依赖HASH JOINs 作为您的物理连接操作,因为它并不总是连接两个数据集的最有效方法。通过这样做,您将放弃引擎的其他 2/3 方式,而这些方式可能会更有效地将您的数据连接在一起。
这是错误的:
仅仅因为您不需要对堆进行排序并不意味着您不会从对其进行过滤或其他一些排序查找会更快的操作中受益。如果无法在计划中更早地应用过滤操作并且最终扫描整个堆,则您可能会冒着散列整个表的风险。
有了聚集索引,至少可以更高效地查找或扫描,从而减少计划早期操作的数据量。然后,散列后的数据集会小得多,从而使操作更快、更高效。
至少这是一个例子。
另一个更简单的原因是,您不应该总是依赖
HASH JOIN
s 作为您的物理连接操作,因为它并不总是连接两个数据集的最有效方法。通过这样做,您将放弃引擎的其他 2/3 方式,而这些方式可能会更有效地将您的数据连接在一起。