2016-07-27 35 views
2

我不知道我在哪裏問這個問題,我只想知道Inner JoinInner Remote Join之間的區別是什麼? 我剛纔想實現的兩個連接如下圖所示:Inner Join VS內部遠程加入之間的區別

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哪個更好。

感謝

+0

的SQL Server版本? – jarlh

+0

@jarlh我正在使用'MS SQL Server 2012' –

回答

2

如果你看一下郵件標籤,你會看到

警告:加入訂單已執行,因爲本地加入提示是 使用。

當您使用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

+0

感謝馬丁的努力..) –

1

如果兩個表都是本地的,那麼「遠程」提示不應該改變任何東西。

在你的情況下,在執行計劃的差異來自於使用的列聯接:

P.UserId=U.UserId 

VS

P.fdUserId=U.fdUserId 

不知道您的架構,我想說的是,在列第二個查詢沒有編入索引,因此需要使用排序操作,因爲它們使用聚簇索引上的順序進行檢索。

0

內部遠程連接和內部連接顯示相同的結果,但我建議使用內部連接而不是內部遠程。多次測試,返回相同。

0

遠程加入

  • 在左表是本地表和右表是遠程表,這非常有用。應使用
  • REMOTE只在左表具有比右表的行較少