在SQL Server中,我应该为表或存储过程创建同义词吗



如果其他地方已经回答了这个问题,请发布一个链接,对我大喊大叫,然后结束这个问题。我环顾四周,看到了类似的东西,但没有找到我想要的东西。

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

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

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

谢谢!

同义词只是为了简化重定向而定义的别名,它们对性能没有任何影响,值得考虑。是的,他们被建议重定向,他们确实让重定向变得容易多了。

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

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

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

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


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

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

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

"简单选择"one_answers"复杂选择"之间的平衡点是了解数据和测试的问题。

HTH:)

最新更新