内部连接 ​​VS 内部远程连接的区别

Sun*_*mar 3 sql sql-server join sql-server-2012

我不知道我必须在哪里问这个问题,我只想知道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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

随着Remote Inner Join我:

在此处输入图片说明

Inner Join我得到了简单的:

在此处输入图片说明

我对SQL Execution Plan.

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

谢谢

Mar*_*ith 5

如果您查看消息选项卡,您将看到

警告:由于使用了本地连接提示,因此已强制执行连接顺序。

当您使用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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明