0

这是我的问题。我定义了一个链接服务器,我们称之为LINKSERV,它有一个名为LINKDB的数据库。在我的服务器(MYSERV)中,我有MYDB数据库。

我想执行下面的查询。

SELECT *
FROM LINKSERV.LINKDB.LINKSCHEMA.LINKTABLE
    INNER JOIN MYSERV.MYDB.MYSCHEMA.MYTABLE ON MYKEYFIELD = LINKKEYFIELD

问题是,如果我查看分析器,我会看到在LINKSERV服务器中进行了很多 SELECT。它们看起来类似于:

SELECT * 
FROM LINKTABLE WHERE LINKKEYFIELD = @1

where@1是为每个 SELECT 更改的参数。当然,这是不需要的,因为它似乎没有执行。我可能是错的,但我认为问题与在 JOIN 中使用不同的服务器有关。事实上,如果我避免这种情况,问题就会消失。

我对吗?有解决办法吗?先感谢您。

4

1 回答 1

1

您看到的可能是最佳解决方案,因为您没有可用于限制从远程服务器返回的行数的过滤器语句。

当您执行从两个或多个服务器提取数据的查询时,查询优化器必须决定要做什么:将大量数据拉到请求服务器并在那里进行连接,或者以某种方式将部分查询发送到链接服务器评估?根据过滤器和两台服务器上统计信息的可用性或质量,优化器可能会为连接选择不同的操作(合并或嵌套循环)。

在您的情况下,它已确定本地表的行数少于目标,并请求对应于每个本地行的目标行。

用于 JOIN 子句时的链接服务器行为中描述了此行为和提高性能的方法

显而易见的优化是更新您的统计信息并添加一个 WHERE 语句,该语句将过滤从远程表返回的行。另一个优化是从远程服务器只返回你需要的列,而不是选择*

于 2013-09-06T16:07:56.107 回答