SQL Server 2012慢于2008


15

我将大型网站和数据库从旧服务器(Windows 2008 / SQL Server 2008/16 GB RAM / 2 x 2.5 GHz四核/ SAS磁盘)迁移到了更好的新服务器(Windows 2008 R2 / SQL Server 2012 SP1 / 64 GB RAM / 2 x 2.1 GHz 16核处理器/ SSD磁盘)。

我分离了旧服务器上的数据库文件,将它们复制并附加到新服务器上。一切进展顺利。

之后,我将兼容性级别更改为110,更新了统计信息,并重建了索引。

令我感到非常失望的是,我注意到,在新的SQL 2012服务器上,大多数SQL查询的速度要比旧的SQL 2008服务器慢得多(慢2-3-4倍)。

例如,在具有约70万条记录的表上,在旧服务器上,对索引的查询花费了约100毫秒。在新服务器上,相同的查询大约需要350毫秒。

所有查询都一样。

我会在这里有所帮助。让我知道要检查/验证的内容。因为我很难相信,在具有更新的SQL Server的更好的服务器上,性能会更差。

更多细节:

内存设置为最大。

我有此表和索引:

CREATE TABLE [dbo].[Answer_Details_23](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [UserID] [int] NOT NULL,
    [SurveyID] [int] NOT NULL,
    [CustomerID] [int] NOT NULL default 0,
    [SummaryID] [int] NOT NULL,
    [QuestionID] [int] NOT NULL,
    [RowID] [int] NOT NULL default 0,
    [OptionID] [int] NOT NULL default 0,
    [EnteredText] [ntext] NULL,
 CONSTRAINT [Answer_Details_23_PK] PRIMARY KEY NONCLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IDX_Answer_Details_23_SummaryID_QuestionID] ON [dbo].[Answer_Details_23]
(
    [SummaryID] ASC,
    [QuestionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

我执行了以下查询:

set statistics time on;
select summaryid, count(summaryid) from Answer_Details_23 group by summaryid order by count(summaryid) desc;
set statistics time off;

旧服务器-SQL Server执行时间:CPU时间= 419毫秒,经过时间= 695毫秒。

新服务器-SQL Server执行时间:CPU时间= 1340 ms,经过的时间= 1636 ms。

执行计划在此处上传:http : //we.tl/ARbPuvf9t8

以后更新:

  • AMD 2.1GHz Opteron 16核心处理器看起来比Intel 2.5GHz四核处理器差很多
  • 极大的改进,将车窗电源选项从平衡切换到大功率
  • 进一步改进,将最大并行度更改为8,将成本阈值更改为4

现在,SQL Server执行时间:CPU时间= 550毫秒,经过的时间= 828毫秒。

它仍然比旧服务器差,但还不错。如果您还有其他建议(除了本地查询优化之外),请随时发表评论。


评论不作进一步讨论;此对话已转移至聊天
保罗·怀特

Answers:


8

我在SQL Server上也遇到过类似的问题,可能是您的服务器配置不理想。较新的Xeon随附TurboBoost,HT等,它们会显着影响服务器性能。

例如,我们取得了成功; Dell服务器的低延迟配置

该设置将适用于非Dell服务器,它们的名称可能不同。

通过将Windows电源管理配置文件从Balanced设置为高性能,我们还提高了性能。最后一点是建议在x64服务器上为OS保留最多8GB的内存,默认的SQL安装会占用所有内存。您可能希望通过将最大SQL Server内存配置设置为小于总内存4 / 8GB来尝试保留4 / 8GB。

我的建议是,如果可能的话,还原到旧服务器。如果您没有可用的回归/自动化/加载脚本,那么您最好的办法是在繁忙期间记录1-4个小时的系统活动。然后,设置与生产相同的Web服务器,并设置客户端计算机以运行脚本。对新服务器运行相同的活动,进行配置更改,然后再次运行相同的活动。确实,您可能想做更多的事情,但似乎并不可行,并且不在此问题范围之内。


服务器上的负载不是很高。SQL Server通常位于20-35 GB的内存中。任何时候我们都有超过16 GB的可用内存。此外,处理器通常不会通过10-15%的使用率。
prog_sr08 2013年

2
迄今为止,通过将Windows电源管理从平衡功率设置为高功率,可以实现最大的改进。因此,它确实看起来像是处理器问题。SQL Server执行时间:CPU时间= 892毫秒,经过的时间= 874毫秒。
prog_sr08

8

让我知道要检查/验证的内容

您遇到性能问题。请遵循诸如“ 等待和队列”之类的性能故障排除方法来确定瓶颈。链接的方法向您显示了要测量的内容和方法。在此处发布调查结果,我们会根据您的实际测量结果为您提供具体建议。由于它太开放,任何人都可以猜测。将其范围缩小到特定问题将消除猜测。

更新后

计划是完全不同的。旧的计划在堆栈上的流聚合很低,实际上对基数的估计很差(141k vs. 108k),而哈希算术进一步错误地预测了,反之(35k vs. 108k)。新计划没有数据流汇总,并且一直到顶部都有准确的估算值。当然,这并不能解释为什么旧计划执行得更快

底部扫描的行号稍有不同(并不重要),但成本却大不相同:旧的是2.49884(IO 2.28979 CPU 0.20905),而新的是1.59109(IO 1.53868 CPU 0.0524084)。再次指出,2012年将有更好的执行力(索引重建也许减少了碎片?)。

线程数有很大不同:新线程数(每个线程约23000行)与旧线程数(每个线程约95000行)分别为32和8。桌子很窄。这可能是在大量线程的实际伤害,因为很多更加频繁的性能缓存废票。我会尝试:

  1. 消除新服务器配置中的超线程(如果有)和/或
  2. 尝试使用DOP 8查询。

注意到您的评论:

使用maxdop 8 Query添加执行计划实际上是通过这种方式更快

可能只是CPU互相踩脚而已。有了SSD,IO可能几乎就不存在了,因此表肯定太小了,无法保证32个扫描仪。交换交换可能会使L1 / L2不断失效。


1
2012年的一切都比2008年要慢得多。在这里,我并不是要优化查询。我很乐意在此新服务器上至少具有与完全相同的数据库相同的性能。
prog_sr08

1
等待和队列与优化查询无关。关于识别瓶颈。
Remus Rusanu 2013年

我下载了文件。看起来很有趣。我现在在上面,但看起来要花点时间。您能建议先看哪里?
prog_sr08

1
等待统计。在2008年和2012年将它们重置,在这两者上运行5-10分钟的负载,然后比较2008年和2012
。– Remus Rusanu

恐怕我现在无法比较两个服务器之间的统计信息,因为新服务器托管一个实时站点/数据库。在旧服务器上保留了不再处于负载状态的数据库。
prog_sr08 2013年

3

对于大多数现代多核系统,尤其是多CPU系统,其硬件体系结构应使内存的某些部分远离某些内核/处理器,并且内存的某些部分接近某些内核/处理器。这称为非统一内存体系结构,简称NUMA。您希望您的MAXDOP设置与每个NUMA节点的内核数相匹配,以最大程度地减少给定numa节点需要在其自身的内存之外获取数据的次数。

您可以使用以下命令检查新计算机的配置,并确保从硬件角度将MAXD​​OP设置为最佳设置:

DECLARE @CPUs int;
DECLARE @NumaNodes int;
DECLARE @ServerRAMInMB int;

SET @ServerRAMinMB = (SELECT (i.physical_memory_kb / 1024) AS ServerMemory 
    FROM sys.dm_os_sys_info i);
SET @CPUs = (SELECT i.cpu_count from sys.dm_os_sys_info i);
SET @NumaNodes = (SELECT MAX(c.memory_node_id) + 1 FROM sys.dm_os_memory_clerks c 
    WHERE memory_node_id < 64);

SELECT @ServerRamInMB, @CPUs, @NumaNodes;

IF @CPUs > 4 /* this would be 4 cores, not 4 CPUs */
BEGIN
    DECLARE @MaxDOP int;
    SET @MaxDOP = @CPUs * 0.75;
    IF @MaxDOP > (@CPUs / @NumaNodes) SET @MaxDOP = (@CPUs / @NumaNodes);
    EXEC sp_configure 'max degree of parallelism', @MaxDOP;
    EXEC sp_configure 'cost threshold for parallelism', 4; 
END

我在@ServerRamInMB此处包括该参数,因为我使用它来将Max Server MemoryMin Server Memory配置选项设置为适合给定服务器的值。


1
我有64 GB RAM,32个处理器核心,4个numa节点。我将最大并行度设置为8,成本阈值设置为4。使用此设置并将power选项设置为高功率,SQL Server执行时间:CPU时间= 550 ms,经过时间= 828 ms。
prog_sr08

那是胜利吗?很高兴看到这对您有用!
Max Vernon

0

您使用哪种版本和许可模式?您可能没有使用所有内核。请参阅此页上的注释-http://msdn.microsoft.com/zh-cn/library/ms143760.aspx

“具有基于服务器+客户端访问许可(CAL)的许可的企业版每个SQL Server实例最多限制为20个核心。”


2
这仅在他之前拥有CAL并加入CAL的情况下才适用。即使只有20个内核,性能也不应该比以前的系统(只有8个内核)显着下降。
亚伦·伯特兰

我有网络版(仅限于较少的4个Socket或16核)。无论如何,在旧服务器上,我只有8个核心。
prog_sr08 2013年

0

我遇到的问题与本页所述的问题相同:将功率设置从“平衡”切换到“高性能”产生了巨大的变化-响应时间增加了一倍以上。现在我们正在使用固态硬盘,我认为能耗并不是问题所在。


-2

在没有任何有效解决方案的情况下,我也已经解决了至少两个星期的问题,而不是使一个问题与另一个问题混淆。

最后的解决方法如下:

  1. 我已将兼容性从010重置为011

  2. 也重置主数据库的兼容性。默认情况下,sql将保留旧的兼容性设置。我们需要手动更改。

祝一切顺利

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.