Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中,我应该为表或存储过程创建同义词吗?_Sql Server_Stored Procedures_Database Performance_Synonym - Fatal编程技术网

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

Sql server 在SQL Server中,我应该为表或存储过程创建同义词吗?,sql-server,stored-procedures,database-performance,synonym,Sql Server,Stored Procedures,Database Performance,Synonym,如果其他地方已经回答了这个问题,请发布一个链接,对我大喊大叫,然后关闭这个问题。我环顾四周,看到了类似的东西,但没有找到我想要的东西 我目前正在编写几个需要来自另一个数据库的数据的存储过程。该数据库可能位于另一台服务器或同一台服务器上,这取决于客户的网络。我想使用同义词,这样,如果需要从中获取数据的表的位置发生更改,我就可以更新同义词一次,而不必返回到所有存储过程并更新它们的引用 我想知道的是,使用同义词的最佳方法是什么。在此之前,我读过一篇文章,上面说当使用视图或表时(尤其是在链接服务器上),

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

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

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

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


谢谢

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

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

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

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

大多数从业者最终决定对此问题进行两种修复,或者1)如果是表,则只需先将远程表行复制到本地#temp表,然后查询该表,或者2)如果更复杂,则在远程服务器上编写存储过程,然后使用INSERT INTO..execute AT执行,检索远程信息



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

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

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

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


HTH:)

您可以使用链接服务器来执行此操作,但通常这种远程查询不是一个好主意。不幸的是,我认为我别无选择,只能使用链接服务器。我的问题更多的是关于从其他数据库/服务器获取数据的最佳方式是什么。从表中获取数据的存储过程的同义词,或表本身的同义词?仅供参考:没有“内存表”这样的东西。好的,是的,从技术上讲,SQLServer2012中有,但它们非常专业,而不是人们通常在SQLServer中谈论“内存中的表”时所指的。通常它们在表变量中的含义,由于各种原因,被广泛认为是内存中的表。不是。是的,记忆表是一个我用得不正确的术语,我有点意识到它,但我有时会让它溜走。我的理解是临时表和表变量都存储在TempDB中。对吗?谢谢!这是一个很好的回答!根据客户的不同,我需要从中获取数据的远程表可能会变得相当大,因此您认为选项1是一个实用的解决方案吗?@b是的,试试看。很难预测,所以最好的方法通常是先尝试最简单/最简单的方法。使用较小的数据子集,第一种选择似乎要快一点。我猜,如果数据越多,差异就会越明显。谢谢你的建议!