Sql-Server

SQL Server INNER REMOTE JOIN 返回的行數多於 INNER JOIN

  • August 4, 2017

我正在嘗試將幾行從遠端視圖連接到本地表。該視圖有大約 3 億行,所以我想使用 REMOTE 查詢提示,這樣就不必將所有 300 萬行都傳輸到我的電腦上。

SELECT R.Something, L.ID, L.Something
FROM [dbo].[LocalTable] L
INNER JOIN (
   SELECT TOP 100 Something, L_ID FROM [RemoteServer].[RemoteDB].[dbo].[RemoteTable]
   ) R
ON L.ID = R.L_ID

正如我所料,這將返回 100 行,並且正如我所料,基本上不需要時間。

然而,

SELECT R.Something, L.ID, L.Something
FROM [dbo].[LocalTable] L
INNER REMOTE JOIN (
   SELECT TOP 100 Something, L_ID FROM [RemoteServer].[RemoteDB].[dbo].[RemoteTable]
   ) R
ON L.ID = R.L_ID

開始返回數千行。幾秒鐘後我退出了它,但它是數万 - 數十萬。

查詢提示如何更改我的結果集?

TOP 100毫無ORDER BY疑問,遠端表中的 100 行最終參與連接是不確定的。這取決於執行計劃,並且可能會有所不同。

如果是一對多關係,則可能是一批 100 行在連接另一側的匹配項比另一批不同的 100 行匹配更多。

ORDER BY您應該在某些唯一列或列組合上指定(在派生表內)以確保確定性結果。

您可以嘗試強制遠端查詢遠端執行:

SELECT R.Something, L.ID, L.Something
FROM [dbo].[LocalTable] L
INNER JOIN (
       SELECT TOP 100 Something, L_ID 
       FROM OPENQUERY([RemoteServer], 'SELECT Something, L_ID
                                       FROM [RemoteDB].[dbo].[RemoteTable]'
                     )
              ) R
ON L.ID = R.L_ID

或者(如果您希望 100 限制器出現在遠端查詢中):

SELECT R.Something, L.ID, L.Something
FROM [dbo].[LocalTable] L
INNER JOIN (
       SELECT Something, L_ID 
       FROM OPENQUERY([RemoteServer], 'SELECT TOP 100 Something, L_ID
                                       FROM [RemoteDB].[dbo].[RemoteTable]'
                     )
              ) R
ON L.ID = R.L_ID

引用自:https://dba.stackexchange.com/questions/145003