Sql-Server
SQL Server INNER REMOTE JOIN 返回的行數多於 INNER JOIN
我正在嘗試將幾行從遠端視圖連接到本地表。該視圖有大約 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