内部加入VS内部远程加入的区别

时间:2016-07-27 07:18:48

标签: sql sql-server join sql-server-2012

我不知道在哪里提出这个问题,我只是想知道Inner JoinInner Remote Join之间有什么区别? 我刚尝试实现了如下所示的两个连接:

With Remote Inner Join

SELECT P.CompanyName,u.UserName from tb_Offices AS P
INNER REMOTE JOIN 
tb_Users AS U
on P.UserId=U.UserId

With Simple Inner Join

SELECT P.CompanyName,u.UserName from tb_Offices AS P
INNER JOIN 
tb_Users AS U
on P.UserId=U.UserId

两个查询都返回相同类型的记录。

然后我尝试使用执行计划:

Remote Inner Join我得到了:

enter image description here

并且简单Inner Join我得到了:

enter image description here

我对SQL Execution Plan并不友好。

我只是想知道Inner JoinInner Remote Join之间哪个更好。

由于

5 个答案:

答案 0 :(得分:3)

如果您查看消息标签,您会看到

  

警告:已强制执行连接顺序,因为本地连接提示是   使用

当您使用INNER REMOTE JOIN提示时,您强制表按照所写的顺序加入,而不是允许它探索所有可能的连接排列。

与指定OPTION (FORCE ORDER)

类似的结果

这解释了不同的执行计划。

此提示不适用于本地表。

在这种情况下无意中强制连接顺序的示例将是非常消极的 - 因为它强制大型表A和B首先连接,然后在C上连接消除所有行。当优化器不受约束时(下面的第一个计划)它重新排序(C x A)x B,计划效率更高。

CREATE TABLE #A(X INT PRIMARY KEY);
CREATE TABLE #B(X INT PRIMARY KEY);
CREATE TABLE #C(X INT PRIMARY KEY);

INSERT INTO #A 
SELECT TOP (10000000) ROW_NUMBER() OVER (ORDER BY @@SPID) FROM master..spt_values v1, master..spt_values v2

INSERT INTO #B 
SELECT * FROM #A

SELECT *
FROM #A INNER JOIN #B ON #A.X = #B.X 
        INNER JOIN #C ON #A.X = #C.X 

SELECT *
FROM #A INNER REMOTE JOIN #B ON #A.X = #B.X 
        INNER JOIN #C ON #A.X = #C.X 

DROP TABLE #A, #B,#C

enter image description here

答案 1 :(得分:1)

只有当右表位于远程服务器上且左侧是本地时,才应尝试使用REMOTE。此外,只有当左表的行数少于右表时,才应使用REMOTE。这些行记录于https://msdn.microsoft.com/en-us/library/ms173815.aspx

答案 2 :(得分:1)

如果两个表都是本地的" remote"提示不应该改变任何东西。

在您的情况下,执行计划的差异来自连接中使用的列:

P.UserId=U.UserId

VS

P.fdUserId=U.fdUserId

在不知道您的架构的情况下,我会说第二个查询中的列没有索引,因此需要使用排序操作,因为它们是使用聚簇索引上的顺序检索的。

答案 3 :(得分:0)

内部远程连接和内部连接显示相同的结果,但我建议使用内部连接而不是内部远程。多次测试,它返回相同。

答案 4 :(得分:0)

远程加入

  • 当左表是本地表而右表是远程表时,这很有用。
  • 仅当左表的行数少于右表
  • 时才应使用REMOTE