代码之家  ›  专栏  ›  技术社区  ›  Dennis

SQL Server 2005:选择连接来自远程服务器的表的操作太慢-当我“选择最小值(列)”时

  •  3
  • Dennis  · 技术社区  · 15 年前

    更新:在一些实验之后,当我调用“select min(column)from the tablevaluedfunction()”时,会发现速度很慢。

    我将调用本地服务器ServerLocal和其他远程服务器ServerForeign。我在serverlocal上的表值函数中有一个SQL查询,如下所示:

    SELECT columns
    FROM ServerForeign.database.tableA
    JOIN ServerForeign.database.tableB ON columns
    JOIN ServerForeign.database.tableC ON columns
    JOIN ServerForeign.database.tableD ON columns
    JOIN ServerForeign.database.tableE ON columns
    JOIN ServerForeign.database.tableF ON columns
    WHERE conditions
    

    我的问题是:

    当我运行这个命令时,serverlocal是否将整个查询发送给serverforge,并要求它自己进行连接并在一个操作中返回结果,或者它是否获取整个表,不必要地传输所有内容,而只是在serverlocal上过滤/连接它们?

    表值函数中的“Where条件”非常普遍;在调用表值函数的各个地方,它在条件中进一步适用。将WHERE子句移到表值函数代码中是否可以提高效率,或者没有区别?

    将表值函数放在ServerForeign上并从ServerLocal调用它会有很大的好处吗,还是仅仅传输数据会导致同样的缓慢?如果我确实将表值函数移到了serverForeign,并且serverLocal在调用表值函数的地方应用了一个WHERE子句,那么SQL Server是否足够智能,能够将该WHERE子句从serverLocal传输到serverForeign,并使用它来减少传输的行数,或者它是否不加考虑地返回所有这些行并删除行?不匹配?

    由于各种外部原因,我不希望在serverforign上放置任何代码。如果有一种方法可以在ServerLocal上运行所有的SQL代码,并且仍然有效地处理来自ServerForeign的数据,那就更好了。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Ben Dempsey    15 年前

    我自己也遇到过这个。很多时候,远程表将被复制到本地数据库以执行查询。尝试删除远程数据库上的任何“where”子句条件,它应该会加快速度。

    显然,这不是一个解决方案,但大多数建议在远程数据库上创建一个SP或视图,然后调用它。

    因此,在您的情况下,如果您创建了一个视图,请确保远程服务器上有WHERE子句,至少是远程表中的列。

        2
  •  1
  •   SqlRyan    15 年前

    如果您执行一个执行计划(SQL Server Manager Studio中的Control-L),您将看到它提交的内容。这些步骤将被称为“远程查询”,如果您将鼠标悬停在上面,它将向您显示正在发送的远程查询。

        3
  •  1
  •   cjk    15 年前

    我发现在这种情况下,在临时表中本地缓存远程数据会更快,特别是当您可以使用WHERE子句过滤它的时候。