【问题标题】:In SQL Server, should I create synonym for a table or a stored procedure?在 SQL Server 中,我应该为表或存储过程创建同义词吗?
【发布时间】:2014-01-11 19:34:35
【问题描述】:

如果已在其他地方回答过此问题,请发布指向它的链接,对我大喊大叫,然后关闭此问题。我环顾四周,看到了类似的东西,但没有找到我要找的东西。

我目前正在编写几个需要来自另一个数据库的数据的存储过程。该数据库可以在另一台服务器或同一台服务器上,它仅取决于客户的网络。我想使用同义词,这样如果我需要数据的表的位置发生变化,我可以更新同义词一次,而不必返回所有存储过程并更新它们的引用。

我想知道使用同义词的最佳方法是什么。我之前读过一篇关于 SO 的帖子,说使用视图或表时(尤其是跨链接服务器)会降低性能。这可能是由于 SQL Server 在使用同义词时能够识别表上的索引。我找不到那个帖子了,或者我会发布一个链接。建议最好的方法是为存储过程创建同义词,并将生成的数据加载到内存或临时表中。

不过,我可能没有直接了解我的事实,并希望得到一些澄清。据我所知,创建数据并将数据加载到内存表中通常占执行计划的很大一部分。使用存储过程是否值得付出额外的努力将数据加载到表中,而不是仅仅能够对视图或表运行查询?使用同义词从另一个数据库获取数据的最有效方法是什么?

谢谢!

【问题讨论】:

  • 您可以使用链接服务器来执行此操作,但通常这种远程查询不是一个好主意。
  • 不幸的是,我认为我别无选择,只能使用链接服务器。我的问题更多是关于从其他数据库/服务器获取数据的最佳方式是什么。从表/表中获取数据的存储过程的同义词还是表本身的同义词?
  • 仅供参考:没有“内存表”之类的东西。好的,是的,在 SQL Server 2012 中从技术上讲,但它们是非常专门化的,而不是人们在谈论 SQL 中的“内存表”时通常所说的意思服务器。 通常它们在表变量中的含义,由于各种原因被广泛认为是内存表。不是。
  • 是的,内存表是一个我用错了的术语,我有点意识到这一点,但我有时会让它溜走。我的理解是临时表和表变量都存储在TempDB中。对吗?

标签: sql-server stored-procedures database-performance synonym


【解决方案1】:

同义词只是为了使重定向更容易而定义的别名,它们没有值得考虑的性能影响。是的,他们被建议进行重定向,他们确实使它更容易。

另一方面,同义词指向会产生重大的性能影响(这与同义词本身无关)。

在同一服务器实例上的其他数据库中使用表和视图的影响很小。我听说过 10% 被引用,我可以公平地说我从未观察到它比这更高。据我所知,这种影响主要来自优化器效率的降低。

在其他服务器实例上使用对象,无论是通过链接服务器定义,还是通过 OpenQuery 完全是另一回事。这些往往很多慢,主要是因为 MS DTC 和优化器决定对查询的远程方面几乎不进行优化的综合影响。这对于小型查询和小型远程表来说往往是可以忍受的,但查询和/或远程表越大,这种情况就越糟糕。

大多数从业者最终决定针对这个问题的两个修复之一,要么 1) 如果它是一个表,那么只需先将远程表的行复制到本地 #temp 表,然后查询 那个,或者,2)如果比较复杂,那么在远程服务器上写一个存储过程,然后用INSERT INTO..EXECUTE AT执行,检索远程信息。


至于如何使用/组织您的同义词,我的建议是在您的数据库中创建一个单独的所有者模式(使用适当的名称,例如 [Remote]),然后将您的所有同义词放在那里。然后当你需要重定向时,你可以编写一个存储过程,它会自动找到所有指向旧位置的同义词并将它们更改为新位置(我就是这样做的)。使处理位置/名称更改变得更加容易。

【讨论】:

  • 谢谢!那是一个很好的答案!根据客户的不同,我需要数据的远程表可能会变得非常大,那么您认为选项 1 是一个实用的解决方案吗?
  • @bsayegh 试试看。很难预测,所以最好的方法通常是先尝试最简单/最容易的方法。
  • 使用较小的数据子集,似乎第一个选项要快一些。我猜有更多数据,差异会更明显。感谢您的建议!
【解决方案2】:

选择选项 1 或 2 取决于查询的性质。如果您可以使用相对简单的 Select 和良好的 Where 子句来检索数据来限制行数,那么选项 1 通常是最佳选择。不要加入本地和远程表。将远程数据拉到本地 #temp 表中,并在单独的查询中连接该临时表上的本地表。

如果查询更复杂,具有多个连接和/或复杂的 Where 条件,则通过远程过程调用将数据检索到本地 #temp 表中通常是最佳选择。同样,不要加入本地和远程过程,并尽量减少远程过程的参数数量/大小。

“简单选择”和“复杂选择”之间的平衡点是了解您的数据和测试。

HTH :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多