SQL Server INNER REMOTE JOIN 返回的行数比 INNER JOIN 多

xyz*_*zzy 7 sql-server hints sql-server-2008-r2

我正在尝试将远程视图中的几行加入本地表。该视图有大约 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
Run Code Online (Sandbox Code Playgroud)

正如我所料,这将返回 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
Run Code Online (Sandbox Code Playgroud)

开始返回数千行。几秒钟后我退出了它,但它是数万 - 数十万。

查询提示如何更改我的结果集?

Mar*_*ith 18

TOP 100绝不ORDER BY意味着远程表中的哪 100 行最终参与连接是不确定的。这取决于执行计划并且可能会有所不同。

如果是一对多关系,则可能是一批 100 行在连接的另一侧比另一批 100 行具有更多匹配项。

您应该ORDER BY在某些唯一列或列组合上指定(在派生表内)以确保确定性结果。


SQL*_*DBA 1

您可以尝试强制远程查询远程运行:

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

或者(如果您希望 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
Run Code Online (Sandbox Code Playgroud)