从 (SQL) 链接服务器视图缓存 table 的最佳方法是什么?

What is the best way to cache a table from a (SQL) linked server view?

我有一个检索数据的视图 from/through 链接服务器,因此当通过视图调用链接 table 时,我将使用 select * from linkerserver.linkedtable。我的查询成功了,我得到了 table 的信息。

然而,我担心使用链接服务器时的速度和争用,尤其是在有多个用户的情况下 accessing/calling sp(存储过程)使用链接服务器视图。

我不确定如何解决这个问题,或者即使它是一个问题? (使用链接服务器视图时会遇到速度或争用问题吗?)。

解决此问题的选项可能是:

  1. 创建一个永久临时 table (##MYTEMP),它是视图中 data/table 的副本,但存在于本地。
  2. 然后所有调用都定向到本地存在的此临时 table。
  3. 或在本地创建一个副本 table 并在当天的第一次调用后使用触发器来填充此 table。

任何有关如何解决此问题或最佳用例的建议都将不胜感激。

把一个SELECT的结果写成一个table是很容易的。将自动创建所有列:

SELECT * INTO NewTable FROM linkerserver.linkedtable

NewTable 可以是普通的 table 也可以是 ###

使用后(或之前)您只需将其删除 table...

我过去 运行 遇到过这个问题。 根据我的经验,我注意到 sql 服务器在涉及 link 服务器时不会生成最佳查询计划。

有这个table的数据库有多大?是否可以只读复制?

如果是,那么最好这样做。如果没有,那么就像您说的那样,您将需要一个本地 table 和一个触发器。或者每 5 分钟左右使用 sql 代理进行一次增量更新。

最好的办法是让其他团队在更新数据后将其推送给您。如果他们只是添加新记录,这就是您需要添加到 table 中的全部内容。如果他们也在更新数据,那么他们可以使用 Merge,以便只处理新记录和更改。

我的第二个选择是在你的服务器上有一个 table,一旦他们完成数据加载,它就会被删除并从链接服务器重新拉出(或使用合并)。您需要就此与他们的团队进行协调。

我最后的选择是让 SQL 代理每晚提取此数据。除非源数据也每晚更新,否则这将是我的第二选择。如果他们在午夜和凌晨 2 点之间处理,我会在凌晨 3 点或 4 点 运行 上班。