Sim*_*man 5 sql-server insert linked-server sql-server-2014
我的本地和远程服务器都使用 SQL Server 2008 R2,但本地服务器最近升级到 SQL Server 2014,并且远程查询的性能受到影响(字面上从几分钟到几小时)。
看来问题在于将数据发送到远程服务器,所以,只要我只是从远程服务器读取数据,它就可以正常执行,只是,如果查询是基于本地端的数据,则似乎是有效地将数据发送到远程服务器。我无法在远程服务器端设置链接服务器,所以我无法从本地服务器拉取远程服务器。
在大多数情况下,我可以重写查询以将数据从远程服务器拉到本地表中,过滤本地数据,然后将相对较少的更新发送到远程服务器 - 仍然比以前慢,但功能正常。
然而,当做任何涉及大量记录的事情时,它是不可用的。典型的例子是这个查询(最初它在本地服务器上执行更复杂的查询,所以我将其更改为首先填充最终表的本地副本,以便我可以对 INSERT 执行最简单的查询);
INSERT INTO [REMOTE-DB].Databasename.dbo.Test_Table
SELECT Person_Nbr, FullName, Birth
FROM Test_Table WITH (nolock)
Run Code Online (Sandbox Code Playgroud)
即使当我尝试 OPENQUERY 时,它似乎也没有更快;
INSERT OPENQUERY ([REMOTE-DB], 'SELECT Person_Nbr, FullName, Birth FROM Databasename.dbo.Test_Table')
SELECT Person_Nbr, FullName, Birth
FROM Test_Table WITH (nolock)
Run Code Online (Sandbox Code Playgroud)
如果不是这在旧版本的 SQL Server 上几乎立即起作用,我会接受这是一个事实,但性能差异如此巨大,似乎必须有一些我遗漏的明显修复. 我无法控制本地服务器,但他们的 DBA 声称数据库配置与旧设置一致。
你有什么想法我可以做些什么来解决这个问题,或者我可以指点 DBA 吗?
“我的本地和远程服务器都使用 SQL Server 2008 R2,但本地服务器最近升级到 SQL Server 2014,远程查询的性能已经下降(从几分钟到几小时)。”
当 Sql Server 性能大幅下降时,我的第一反应通常是“发生了什么变化?”
好吧 - 您刚刚将本地服务器升级到 Sql Server 2014,它引入了新的基数估计器( CE )。
正如博客中引用的(使用跟踪标志仔细测试 2014 年基数估计器):
当您迁移到 SQL Server 2014 时,不要立即打开新的基数估计器,建议首先将数据库保留在 SQL Server 2012 兼容模式下,坚持使用旧的基数估计器。让数据库稳定下来几周,让人们表达他们的不满,并给自己一些时间来确保系统至少能像旧系统一样运行。
您说“DBA(对于本地服务器)声称数据库配置与旧设置一致”。那么,如何判断您是否受到新 CE 的影响呢?有几种方法。
首先,针对本地实例运行此查询。
select name, compatibility_level from sys.databases
Run Code Online (Sandbox Code Playgroud)
如果兼容性级别为 120 或更高,那么您肯定“可能”正在使用新的 CE(假设它尚未通过使用会话或全局跟踪标志或强制使用旧 CE 的查询上的 QUERYTRACEON 提示来覆盖)。
查看是否正在使用新 CE 的另一种方法是查看“本地”查询的执行计划 XML 并找到字符串“CardinalityEstimationModelVersion”。
如果是 70,则您使用的是旧版 CE。如果是 120,则您使用的是新的 CE。
我的建议是“首先”弄清楚您是否被新的 Sql Server 2014 CE 所困扰。
互联网上有很多关于这个主题的信息。
另一个有用的链接是The SQL 2014 Cardinality Estimator Eats Bad TSQL for breakfast。
归档时间: |
|
查看次数: |
2357 次 |
最近记录: |