在工作中,我们有两台服务器,一个正在运行的应用程序有很多人使用它有一个SQL Server 2000的后端。 我一直免费查询这个很长一段时间,但不能如存储过程或额外的表,将其添加任何东西。
这导致了我们具有连接至第一个第二个SQL Server和我建立的是查询从侧面使用链接服务器数据都存储过程库。 其中一些查询比我想有什么需要更长的时间。
有人能指出我如何使用链接的服务器的一些好文章? 我在寻找什么数据在两成通常大多数的SQL语句之间传递,可以远程执行特别感兴趣,但我有一种感觉,可能是转移满表,它通常只是一个加入一个小决赛表本地。
还什么链接服务器选项做我目前有:
- 整理兼容真
- 数据访问真
- RPC真
- RPC出真
- 使用远程假整理
- 排序规则名称(空白)
- 连接超时0
- 查询超时0
编辑:
只是想我会更新这个帖子我用动态参数openqueries一会儿来提升性能,谢谢你的提示。 但是当你结束了处理字符串这样做可以让查询更凌乱。 终于在今年夏天我们升级的SQL Server 2008,并实现实时数据镜像。 说实话开放查询正在接近本地查询的速度,我的任务,但镜像肯定的所有SQL更容易处理。
Answer 1:
挂钩加入我会在游标循环劝动态openqueries代替。 这是我已经能够复制的MS Access的唯一途径链接连接性能(至少对于单个远程表)
经常挂在MS SQL连接是通过在堆积如山的表格专门拉一切效率太低..
- 我想知道什么是如此糟糕有关游标循环里面openqueries? 如果做得正确,没有锁定问题。
Answer 2:
避免加入到链接服务器的表。
使用四个部分命名为您的加入可以使用,但更昂贵。 您的加入可能包含可以用来限制数据从链接服务器设置和使用索引列的标准。
例:
SELECT loc.field1, lnk.field1
FROM MyTable loc
INNER JOIN RemoteServer.Database.Schema.SomeTable lnk
ON loc.id = lnk.id
AND lnk.RecordDate = GETDATE()
WHERE loc.SalesDate = GETDATE()
该查询也应用在标准的连接,可以通过链接服务器的连接计算之前使用。
推荐的方法是使用OPENQUERY的。
通过避免使用OPENQUERY的加入本地服务器仅将要执行的查询,而不是远程发送的加入集ID。
使用中的链接找回了一组数据,并在本地进行计算。 无论是使用临时表(用于即席查询),或在夜间作业插入的行中永久表。
Begining交易可能如果远程事务协调在喜欢的服务器设置为根据失败。 使用它会消耗更多的资源。
同时认为,你打运行的应用程序在生产服务器,而你不指定它,我认为是安全的假设正在使用重型交易和做插入和更新。 你抢走资源离开应用程序。
你的目的似乎是使用数据的报告目的。 您的服务器可以设置有一个简单的日志,而不是完全使之更为高效。
您也将避免你的查询由于链接的服务器上的数据移动被取消。 始终留心设置适当的隔离级别为你的查询和表提示NOLOCK一样的。
并请! 切勿将一个OPENQUERY(或任何链接的服务器)在循环中!
Answer 3:
当您使用链接的服务器进行连接这样的,它让你立即连接到(“本地”)服务器是一个与大多数数据,其中链接的服务器仅提供数据的一小部分是很重要的否则,是的,它会因为它需要执行连接拉尽可能多的数据。
备选方案包括跨越到一个临时表复制数据的一个子集进行瘦下来的结果和链接的服务器可以执行任何预先处理尽可能多的工作,然后做“本地”侧加入。
您可能会发现,你可以很容易地通过扭转你做的方式,连接到你无法控制对服务器的性能提升(他们需要做一个链接服务器为你),然后连接到服务器上的链接。 如果你需要做的主要工作有,你就必须创建存储过程中的数据 - 然后将数据推送到您的服务器,并使用你的存储过程出现。
在某些情况下,我只是有链接的服务器执行夜间创造这种总结它推到本地服务器,然后在本地服务器执行其与参加工作。
Answer 4:
皇家疼痛
我们曾经有过在我们店里的几个链接的服务器,它竟然是这样的PITA。
首先,有类似你的描述严重的性能问题。 我感到很震惊,我看到网络I / O统计。 尽管一切努力,我们没有SQL服务器提示到合理的行为。
另一个问题是,存储的特效硬编码了这些链接的服务器名称无处不在,没有办法覆盖它们。 因此,开发商不能轻易对他们的成长沙箱测试感动链接服务器的任何功能。 这是创建普遍使用单元测试套件的主要障碍。
最后,我们完全抛弃了链接的服务器和移动数据同步到网络的服务。
Answer 5:
涉及跨链接服务器的半连接的查询往往不会是非常有效的。 你可能会使用会更好OPENQUERY以数据填充到一个本地临时表,然后从那里进行这项工作。
Answer 6:
我在SQL 2000几年前写的远程链接服务器的应用程序就可以选择你描述相同的性能问题就来了。 我结束了我重写存储过程,以获得最佳的性能几次。
我用临时表广泛。 我发现,这是检索大量远程数据的到一个临时表,然后再加入它,处理它,等联袂本地到远程的表像你desribe很慢更便宜。
显示执行计划和显示估计执行计划往往帮助,虽然我听不懂的很多事情我一直在寻找。
我不知道是否真的有做这些查询与远程服务器,因为它看起来像SQL Server的链接服务器去的时候不能把正常的优化优势有效方式。 它可能会觉得你是传送整个表,因为事实上这是发生了什么。
我想知道如果复制方案可能会为你工作。 通过让本地服务器上的数据,你应该能够编写根据需要将执行正常的查询。
我不知道有什么好的文章,为您指出的。 就在我写更复杂的SQL Server应用程序,我开始想,我需要更好地了解SQL Server的下面是如何工作的。 为此,我们买了MS出版社内部的Microsoft SQL Server 2005系列在这里工作的卡伦·德莱尼编辑。 第1卷:存储引擎绝对是开始的地方,但我还没有那么远得到了进去。 由于我的最后几个项目都没有涉及SQL Server时,我对它的研究已经变得松懈。
Answer 7:
有,你可以设置服务器上一个单独的数据库,而不是使用链接的服务器的可能性?
Answer 8:
它是一个非常慷慨的问题,这可能有很多解决方案。 但是,正如我们已经见证了很多用户说,他们已经尝试了一切。
有什么解决我的问题是..
我升级的SQL Server 2000 SP2从到SP4,如果你已经SP4的SQL Server 2000上,然后运行的Instcat.sql。 按我的经验,我可以向你保证,这将是肯定的工作,如果你与所有其他解决方法用尽。
谢谢,Mithalesh mithalesh.gupta@gmail.com
Answer 9:
动态SQL和功能可以用于绕过硬编码名称的问题。 举例来说,我想一个实施方案,其中功能ufn_linkedDatabase(@purpose为nvarchar(255))与输入 'cpi.cpi'(目的CPI,分用途缺省值)返回“[SERVER-NAME.DOMAIN.LCL,2000]。 [CPI]”在生产环境(在这里我们使用备用端口号为SQL Server,我不知道为什么,包括链接服务器名称)。 然后SQL命令被组装在@Template VARCHAR(最大)与所述表达@ {cpi.cpi}表示链接服务器和数据库,然后@workstring = REPLACE(@Template,N'@{cpi.cpi}”。 ..)。 功能如何实际获得的数据库名是从程序分开 - 查找表是好的。
问题 - 做OPENQUERY(),它很可能还是较好至少除非链接服务器选项“排序规则兼容的”设置“真”,让更多的任务可以链接的服务器上执行 - 即使是在快速网络重要的,而我们的服务器机房内部网络是体面快 - 做OPENQUERY()我可能需要单独处理“cpi.cpi.server”和“cpi.cpi.database”和“cpi.cpi.server.database”。 而且,我可以写出来采用这种设计只有一个应用程序,在这种情况下,它是过度设计。 不过,这意味着该函数本身并没有被任何形式的花哨工作。
在这个问题抛出快速的网络硬件可能是便宜的答案,反正。
文章来源: Linked Server Performance and options