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。
谢谢
如果您查看消息选项卡,您将看到
警告:由于使用了本地连接提示,因此已强制执行连接顺序。
当您使用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)