Sql server 在速度较慢的机器上执行SQL查询速度更快

Sql server 在速度较慢的机器上执行SQL查询速度更快,sql-server,adhoc-queries,Sql Server,Adhoc Queries,我们有两台运行MS SQL 2012的MS SQL服务器。一个有8GB RAM,2个处理器和足够的存储空间。另一个有8个处理器,64GB RAM,多个连接的驱动器,数据、程序、日志和tempdb分开 通常,大型服务器的查询速度更快。然而,在一个简单的查询中,小型机器需要10秒,而另一台机器需要5分钟。据我们所知,SQL Server设置相同,数据相同,两台机器上的查询相同,两台机器上的估计和实际执行计划相同,但大型机器速度较慢。Tempdb是与小型计算机上的SQL.exe位于同一磁盘上的一个文件

我们有两台运行MS SQL 2012的MS SQL服务器。一个有8GB RAM,2个处理器和足够的存储空间。另一个有8个处理器,64GB RAM,多个连接的驱动器,数据、程序、日志和tempdb分开

通常,大型服务器的查询速度更快。然而,在一个简单的查询中,小型机器需要10秒,而另一台机器需要5分钟。据我们所知,SQL Server设置相同,数据相同,两台机器上的查询相同,两台机器上的估计和实际执行计划相同,但大型机器速度较慢。Tempdb是与小型计算机上的SQL.exe位于同一磁盘上的一个文件,在大型计算机的SSD驱动器上的Tempdb中有8个文件

我们可以按照什么步骤来确定为什么大机器上的少数查询比小机器上的查询慢

查询是:

SELECT field1, field2 
FROM lookuptable1
WHERE field2 <> '' 
AND field1 not in (SELECT field1 
    FROM lookuptable2
)

我们在大机器上有16个线程用于并行任务,在小机器上有4个线程用于并行任务。查询没有返回预期的值,但对于较大的机器,返回速度要慢得多。统计数据已重建,查询计划已刷新。

测试是否存在vs IN可能会有所不同

SELECT field1, field2 
FROM lookuptable1 outerTableAlias
WHERE field2 <> '' 
AND not exists (SELECT * 
    FROM lookuptable2 innerTable where innerTable.field1 = outerTableAlias.field1 )


尝试不带字段2的查询。这对于表扫描来说是一个非常可疑的地方。

如果你真的确定数据是相同的,下一步应该是确保结构也是相同的约束、触发器、索引……嗯,好的,你说实际执行计划是相同的?重复检查,数据相同;手动运行查询您是否也使用探查器进行了检查?。这也可能是因为您的大服务器比小服务器更容易受到攻击,这意味着执行计划可能是最优的,但服务器的使用量如此之大,以至于您不得不等待一段时间……您是否比较了在两台机器上运行并启用统计io的结果?使用set showplan_xml打开,然后在diff工具中查看,可能会很有见地。/我的猜测是,根据我在上一篇评论中链接的两篇文章中的某些内容,实际计划可能会有所不同,并且永远不要费心查看估计的计划。对于实际计划,您是否验证所有估计/实际行数是否相同?图表不是唯一需要检查的东西。您还可以使用扩展事件来跟踪执行查询的会话生成的等待,这样您就可以比较查询在功能更强大的机器上执行的操作与在小型机器上没有执行的操作。你应该在计划、等待或两者中找到证据。我在vs EXISTS查询中的经验是,它需要测试和尝试。但是谢谢你的否决票…………这不是我的否决票,但你可能想在提出关于在中使用的广泛主张之前阅读本文。我倾向于使用EXISTS,比如你的例子。减轻压力很简单。只需将其更改为>谢谢文章参考。我把我的帖子改成了“尝试”和“教条式的陈述”。就我个人而言,在我的生活中,我已经看到了三个关于“存在在哪里”的问题。我还有一个喜欢嵌套在子句中的开发人员。三个月后,这个人无法告诉你为什么这个人会这样写。所以我厌倦了。