在一对SQL Server 2014环境中,我们遇到了与链接服务器和同义词相关的一些极端性能问题。似乎SQL Server使用一些distributed query逻辑来确定导致速度明显不同的替代执行路径。我怀疑这是因为有时它决定纯粹远程执行查询,有时它决定从远程服务器中选择所有行并在本地应用where子句,在这种情况下是超过800万行并导致严重延迟。
所以我的问题是,有没有办法让FORCE SQL Server始终远程执行分布式查询,并避免这些性能问题?我们处于这样一种情况:我们需要在存储过程中使用同义词或其他非服务器地址特定的代码,因此4部分寻址不是一个可行的永久选项。
问题案例(5分钟以上执行时间)
-- Returns 1 Row
SELECT S.*
FROM [SYNONYM] S
WHERE S.ID = 'ABC123'
成功案例(1 +/-秒执行时间)
-- Returns 1 Row
SELECT T.*
FROM [SERVER].[DATABASE].dbo.[TABLE] T
WHERE T.ID = 'ABC123'
-- Returns 1 Row
SELECT TOP 1
S.*
FROM [SYNONYM] S
WHERE S.ID = 'ABC123'
引用The top 3 linked server performance killers
引用Linked Servers(和性能问题)
我确认统计数据可以正常访问的尝试也不顺利:
DBCC SHOW_STATISTICS('[SYNONYM]') WITH STAT_HEADER;
收率:
无法处理对象ID #####(对象" [SYNONYM]") 因为它是一个同义词。如果同义词引用的对象是a 表或视图,使用基础对象重试该操作 同义词引用。
当我将其改为4部分名称时:
DBCC SHOW_STATISTICS('[SERVER].[DATABASE].[SCHEMA/DBO].[TABLE]') WITH STAT_HEADER;
它产生:
无法处理对象' [服务器]'因为它是 由四部分组成的名称,任何DBCC命令都不支持。
非常感谢有关同义词和/或链接服务器(SQL Server 2014)的任何建议
答案 0 :(得分:0)
这可能是无关的,但请记住,如果您为链接服务器使用OLEDB驱动程序,则在最初处理远程数据集而不是SQL Server时,它们会使用操作系统中的RAM。我已经知道过去的链接服务器性能问题,其中SQL Server被配置为在主机上消耗尽可能多的RAM,然后导致链接的服务器数据拉动,因为操作系统没有足够的RAM来处理远程呼叫。 只是值得深思。