如果在其他地方已经回答了这个问题,请发布一个链接,对我大喊大叫,然后关闭这个问题。我环顾四周,看到了类似的东西,但并没有找到我想要的东西。
我目前正在编写几个需要来自其他数据库的数据的存储过程。该数据库可能位于另一台服务器或同一台服务器上,它只取决于客户的网络。我想使用同义词,以便如果我需要数据的表的位置发生更改,我可以更新同义词一次,而不必返回所有存储过程并更新其引用。
我想知道的是同义词的最佳方法是什么。我之前阅读了一篇关于SO的帖子,说使用视图或表格(特别是在链接服务器上)时会出现性能损失。这可能是由于SQL Server在使用同义词时识别表上的索引的能力。我找不到该帖子了,或者我会发布一个链接。有人建议最好的方法是为存储过程创建一个同义词,并将结果数据加载到内存或临时表中。
但是,我可能不会直截了当地说明这一点,并希望得到一些澄清。据我所知,创建和加载数据到内存表通常占执行计划的很大一部分。使用存储过程是否值得花费额外的精力将数据加载到表中,而只能运行对视图或表的查询?使用同义词从另一个数据库获取数据的最有效方法是什么?谢谢!
答案 0 :(得分:3)
同义词只是定义别名以使重定向更容易,它们没有值得考虑的性能影响。是的,他们被建议重定向,他们确实让它变得更容易。
另一方面,指向的同义词会对性能产生重大影响(这与同义词本身无关)。
在同一服务器实例上的其他数据库中使用表和视图会产生很小的影响。我听说10%被引用,我可以公平地说我从来没有观察到它高于那个。据我所知,这种影响主要来自优化者效率的降低。
在其他服务器实例上使用对象,无论是通过链接服务器定义还是OpenQuery,都完全是另一个故事。这些往往是 更慢,这主要是因为MS DTC和优化器的组合效果决定对查询的远程方面几乎不做任何优化。对于小型查询和小型远程表,这往往是可以承受的,但查询和/或远程表越大越好。
大多数从业者最终决定针对此问题的两个修复之一,1)如果它是一个表,那么只需先将远程表行复制到本地#temp表,然后在上查询,或者,2)如果它更复杂,则在远程服务器上编写存储过程,然后使用INSERT INTO..EXECUTE AT执行它,以检索远程信息。
至于如何使用/组织您的同义词,我的建议是在您的数据库中创建一个单独的所有者架构(使用适当的名称,如[Remote]
),然后将所有同义词放在那里。然后,当您需要重定向时,您可以编写一个存储过程,该过程将自动查找指向旧位置的所有同义词并将其更改为新位置(这是我的工作方式)。使处理位置/名称更改变得容易得多。
答案 1 :(得分:0)
选择选项1或2取决于查询的性质。如果您可以使用相对简单的Select检索数据并使用良好的Where子句来限制行数,那么选项1通常是最佳选择。不要加入本地和远程表。将远程数据拉到本地#temp表,并在单独的查询中加入该临时表上的本地表。
如果查询更复杂,有多个连接和/或复杂的条件,那么通过远程过程调用将数据检索到本地#temp表通常是最佳选择。同样,请勿加入本地和远程过程,并尽量减少远程过程的参数数量/大小。
"简单选择"之间的平衡点和"复杂选择"是了解数据和测试的问题。
HTH:)