Sql server 使用';最大值';

Sql server 使用';最大值';,sql-server,Sql Server,我们最近在SQLServer2008中遇到了一个奇怪的性能问题 给定这两个查询(它们是等效的) 及 第一个大约需要20秒,而第二个需要0秒 要清除子查询,请执行以下操作: (select tbfl_pk from tablefield where tbfl_name = 'Field with pk 48') 其结果是48 我们在查询计划中看到,它将第二个查询转换为联接,但这仍然不能向我解释为什么会出现这种性能差异。在我看来,如果会有不同,第一个应该会更快 我们在所有相关字段上都有一个索引。然

我们最近在SQLServer2008中遇到了一个奇怪的性能问题

给定这两个查询(它们是等效的)

第一个大约需要20秒,而第二个需要0秒

要清除子查询,请执行以下操作:

(select tbfl_pk from tablefield where tbfl_name = 'Field with pk 48')
其结果是48

我们在查询计划中看到,它将第二个查询转换为联接,但这仍然不能向我解释为什么会出现这种性能差异。在我看来,如果会有不同,第一个应该会更快


我们在所有相关字段上都有一个索引。

然而,我的第一个想法是,第一个查询填满了页面缓存,第二个只是利用了它。缓存可以带来很大的不同

如果这两个查询的计时如此不同(并且一直如此),那么我可以想象这种差异是由于表扫描和索引使用造成的。您可以通过查看查询计划来检查这一点。下一个问题是:“这是什么原因?”

第一个查询通常会进行索引扫描。除非有很多行
tfiv\u fk\u tablefield=48
。如果它这么认为,那么它可能会进行表扫描而不是索引扫描。也就是说,SQLServer有一个考虑统计信息的“智能”优化器。而且,当统计数据过时时,它可能会选择错误的方法

第二种可能会强制执行索引扫描,因为它使用的是连接类型。在这种情况下,过时的统计信息将不会产生影响,而查询做了正确的事情


当然,这都是猜测。您应该查看查询计划,如果仍然合适,请将其包括在这个或另一个问题中。

然而,我的第一个想法是,第一个查询填满了页面缓存,而第二个查询只是利用了它。缓存可以带来很大的不同

如果这两个查询的计时如此不同(并且一直如此),那么我可以想象这种差异是由于表扫描和索引使用造成的。您可以通过查看查询计划来检查这一点。下一个问题是:“这是什么原因?”

第一个查询通常会进行索引扫描。除非有很多行
tfiv\u fk\u tablefield=48
。如果它这么认为,那么它可能会进行表扫描而不是索引扫描。也就是说,SQLServer有一个考虑统计信息的“智能”优化器。而且,当统计数据过时时,它可能会选择错误的方法

第二种可能会强制执行索引扫描,因为它使用的是连接类型。在这种情况下,过时的统计信息将不会产生影响,而查询做了正确的事情


当然,这都是猜测。您应该查看查询计划,如果仍然合适,请将其包括在本问题或其他问题中。

这些时间安排是否一致?或者,您是否只是运行了第一个查询,请注意它花费了很长时间,然后运行了第二个查询?它们是一致的,第一个查询在一段时间后开始运行得更快(下降到6秒),但仍然比第二个查询慢得多。这些计时是否一致?或者,您是否只是运行了第一个查询,注意它花费了很长时间,然后运行了第二个查询?它们是一致的,第一个查询在一段时间后开始运行得更快(下降到6秒),但仍然比第二个查询慢得多。我认为统计数据真的很奇怪,在删除索引后,它甚至开始运行得更快。现在有了好的索引,两个查询都可以立即运行。我真的不知道为什么,但还是谢谢你!我认为统计数据真的很奇怪,在降低指数后,它甚至开始加速。现在有了好的索引,两个查询都可以立即运行。我真的不知道为什么,但还是谢谢你!
select max(tfiv_value) from tablefieldintvalue where tfiv_fk_tablefield = 
(select tbfl_pk from tablefield where tbfl_name = 'Field with pk 48')
(select tbfl_pk from tablefield where tbfl_name = 'Field with pk 48')