vst*_*ien 16 sql-server sql-server-2008-r2 linked-server except
我有两个数据库服务器,通过链接服务器连接。两者都是 SQL Server 2008R2 数据库,链接服务器连接是通过常规“SQL Server”链接使用当前登录的安全上下文建立的。链接的服务器都在同一个数据中心,所以连接应该不是问题。
我使用以下查询来检查列的哪些值identifier
可远程使用,但不能在本地使用。
SELECT
identifier
FROM LinkedServer.RemoteDb.schema.[TableName]
EXCEPT
SELECT DISTINCT
identifier
FROM LocalDb.schema.[TableName]
Run Code Online (Sandbox Code Playgroud)
在两个表上的列上都有非聚集索引identifier
。本地大约有 260 万行,远程只有 54 行。然而,在查看查询计划时,70% 的执行时间用于“执行远程查询”。此外,在研究完整的查询计划时,估计的本地行数是1
而不是2695380
(这是仅选择后面的查询时的估计行数EXCEPT
)。
执行此查询时,确实需要很长时间。
不禁让人疑惑:这是为什么呢?估计是“刚刚”结束,还是链接服务器上的远程查询真的那么昂贵?
Mar*_*ith 10
你目前的计划在我看来是最理想的计划。
我不同意其他答案中的断言,即它将 2.6M 行发送到远程服务器。
在我看来,该计划好像对于从远程查询返回的 54 行中的每一行,它正在对本地表执行索引查找,以确定它是否匹配。这几乎是最佳计划。
考虑到表的大小,用散列连接或合并连接替换会适得其反,而添加中间#temp
表只会增加一个似乎不会给您带来任何好处的附加步骤。
连接到远程资源是昂贵的。时期。
任何编程环境中最昂贵的操作之一是网络 IO(尽管磁盘 IO 往往使其相形见绌)。
这扩展到远程链接服务器。调用远程链接服务器的服务器需要先建立连接,然后需要在远程服务器上执行查询,返回结果并关闭连接。这一切都需要时间通过网络。
您还应该以这样一种方式构建您的查询,即通过网络传输最少的数据。不要指望数据库会为您优化。
如果我要编写此查询,我会将远程数据选择到表变量(或临时表)中,然后将其与本地表结合使用。这确保只有需要传输的数据才会传输。
您正在运行的查询可以轻松地将 260 万行发送到远程服务器以处理该EXCEPT
子句。
归档时间: |
|
查看次数: |
42584 次 |
最近记录: |