从Server 2008开始的从条款文件中简要地提到了3个连接提示及其基本机制:
然而,似乎没有多少关于何时有必要使用它们的信息。
看来,它们可以与哈希、循环和合并一起使用,这些都是为了这个问题的目的已经被理解的。
文件中的有关章节:
对于SQL数据仓库和并行数据仓库,这些连接提示适用于两个发行版不兼容列上的内部联接。它们可以通过限制查询处理过程中发生的数据量来提高查询性能。SQL数据仓库和并行数据仓库允许的连接提示如下:
发布于 2020-06-12 06:01:13
通常情况下,我们使用联接提示来纠正优化器的错误,以确定更好的查询计划。这种情况的发生有很多原因,基本上可以归结为优化是一种“足够好”的方法,受到时间预算的限制,用于寻找计划。
“又称半连接提示”。对于半连接,我们只对另一个表中是否存在匹配行感兴趣。实际上,这通常是因为查询有一个EXISTS()谓词。如果有一个匹配或一百万,结果将是相同的-从左边(外部)表中的单行将被返回。
例如,我们可能需要查询所有曾经下过订单的客户。假设客户是一个小表,但是订单很大,分布在许多节点上。如果我们只需要知道每个客户是否至少存在一行,那么将所有这些数据复制到客户所在的任何地方都是浪费的。减少提示提供了以下内容。从概念上讲,select distinct CustomerId from Order运行在每个节点的保持顺序上,这是相对较快的。
这是减少的反面。在这里,一个表从它的"home“节点大量复制到所有保存数据的节点,该表位于联接的右侧。
在这个例子中,我们需要所有订单的总价值,以Customer之和。我们只有相对较少的客户,可以轻松地适应于一个节点。然而,Orders表是巨大的,并且跨越许多节点。为了满足查询,我们必须将客户数据和订单数据同时放到同一个节点上。它将更有效地复制客户,因为它是较小的。复制提示强制这种行为,在每个持有订单行的节点上创建Customer表的完整副本。
这是另一种说明如何将行从"home“节点移动到另一个节点的方法,以便可以计算联接谓词。这一次,我们要求服务器复制数据,并根据一些新的分发函数分发该副本,这样复制的行将在正确的节点上完成连接。
现在我们有了一个零售电子商务网站,拥有大量的客户和大量的订单。客户是通过CustomerId发布的,订单是由OrderDate分发的。如果我们现在想要join on Customer.CustomerId = Order.CustomerId,最有效的计划可能是根据CustomerId复制订单和重新分发,然后将每个新分区传递给相应的节点。这与复制不同,因为在那里,整个表被复制到每个节点,而在这里,每个节点的一部分数据被复制到其他节点。重新分配的具体处理方式将取决于当前分布和基数。
https://dba.stackexchange.com/questions/228026
复制相似问题