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
在某些唯一列或列组合上指定(在派生表内)以确保确定性结果。
您可以尝试强制远程查询远程运行:
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)
归档时间: |
|
查看次数: |
1408 次 |
最近记录: |