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

时间:2016-08-02 12:44:32

标签: sql-server stored-procedures linked-server

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

但是,我担心使用链接服务器时的速度和争用,特别是如果有多个用户访问/调用使用链接服务器视图的 sp (存储过程)。

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

解决这个问题的方法可能是:

  1. 创建一个持久临时表(## MYTEMP),它是视图中数据/表的副本,但存在于本地。
  2. 然后将所有呼叫定向到本地存在的临时表。
  3. 或在本地创建一个重复的表,并在第一天的第一次调用后触发填充此表。
  4. 有关如何解决此问题或最佳使用案例的任何建议将不胜感激。

3 个答案:

答案 0 :(得分:1)

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

我的第二个选择是在服务器上有一个表,一旦数据加载,就会从链接服务器中删除并重新提取(或使用Merge)。你需要与他们的团队协调。

我的最后一个选择是让SQL Agent夜间提取这些数据。除非源数据也在每晚更新,否则这将是我的第二选择。如果他们在午夜到凌晨2点之间处理,我的工作时间是凌晨3点或凌晨4点。

答案 1 :(得分:0)

SELECT的结果写入表格非常容易。所有列都将自动创建:

SELECT * INTO NewTable FROM linkerserver.linkedtable

NewTable可以是普通表格,也可以是###

使用后(或之前)你只需删除此表......

答案 2 :(得分:0)

过去我遇到过这个问题。 根据我的经验,我注意到sql server在链接服务器时没有生成最好的查询计划。

拥有此表的数据库有多大?是否可以进行只读复制?

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