在三个独立的链接服务器上存在三个不同的数据库SQL0
,SQL1
(托管 2 个数据库),SQL2
(托管 1 个数据库)。SQL0
充当报告服务器并将托管所有有问题的数据库(方法 TBD - 也许复制可能其他),但由于某些审计目的数据将是旧的(<24H),仍然需要实时运行一些查询数据。
两种设置:
设置 1. Localhost\SQL0
- 链接到SQL1
和SQL2
(每个都使用各自的sa
凭据进行连接)
设置 2.SQL1
链接到SQL2
(同样,使用sa
凭据)
有问题的查询连接(目前)这三个数据库中的 8 个表。将来,查询中将有另一台服务器、另一个数据库和几个连接表,由代理定期运行并通过电子邮件发送结果。它通常返回少于 100 行,但TOP 10
在开发中使用受限。
为什么运行此查询SQL2
需要 3 秒或更短的时间才能执行,但运行时需要 105 秒SQL0
?只要它只是网络流量,我愿意忽略 30 倍的执行时间,但如果它影响链接服务器的性能,我需要找到解决方案统计信息。
所有服务器都在同一个 LAN 上,但SQL2
在另一个通过 VPN 连接的建筑物中。
一切都在 SSMS 中,在与所有其他人连接到同一网络的机器上,没有视图,没有链接服务器到链接服务器或其他“并发症”;我可以以 sa 身份访问所有服务器。
性能不佳是因为您使用的是链接服务器。开发人员和数据库管理员之间始终存在意见分歧。数据库管理员知道链接服务器连接很慢。开发人员想要他们,因为他们为他们解决问题。我既是开发人员又是数据库管理员,我记得作为开发人员,我推动添加链接服务器。作为过去 20 年的数据库管理员,我遇到了数千次性能不佳的问题,以找到链接的服务器连接是原因。
使用事务复制将实时数据获取到您的报表服务器。这将消除 24 小时的延迟,并消除您使用链接服务器的需要。您还将在源服务器上获得性能提升,因为只读报告查询不会与运行您公司的实时事务竞争。
您可能遇到的事实是,当查询远程服务器以在本地表上加入或应用 WHERE 子句时,整个数据集正在通过网络返回,然后在本地过滤。
使用 OPENQUERY 可能会更好,在这种情况下,WHERE 子句将在远程主机上执行,并且只返回所需的子集。
如果您需要跨服务器连接,您应该开始查看 ETL 工具。