我不知道在哪里提出这个问题,我只是想知道Inner Join
和Inner 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
我得到了:
并且简单Inner Join
我得到了:
我对SQL Execution Plan
并不友好。
我只是想知道Inner Join
和Inner Remote Join
之间哪个更好。
由于
答案 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
答案 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)
远程加入