SELECT Top(100)比Top(1)快很多

时间:2018-12-13 12:05:52

标签: sql-server

我有一个简单的查询,但我不了解“最高条款”的行为。

func slide(slider: inout Moveable) {
    slider.move(to: CGPoint(x: 100, y: 100))
}

slider(slider: prius) // <--- Compile Error
// Cannot use mutating member on immutable value: 'slider' is a 'let' constant
slider(slider: prius as (inout Moveable) // <--- Compile Error

(*查询是执行计划中的一个简单版本,但完全相同)

  • SELECT Top (1) Timestmp FROM DataTable WHERE [LoadId] = 3104 AND [Temp1] > @Setpoint AND [Temp2] > @Setpoint AND [Temp3] > @Setpoint AND [Temp4] > @Setpoint AND [Temp5] > @Setpoint ORDER BY Timestmp OPTION (RECOMPILE) 上有一个通用的非聚集索引
  • 以及(LoadId, Temp1, Temp2, Temp3, Temp4, Temp5)上的单独的非聚集索引

查询大约需要1分钟才能完成。但是,如果我写Top(100),则需要花费[ms]才能完成。

以下是查询的一些统计信息:

  • 顶部(1):逻辑读25757671,物理读148582,预读读17695
  • 前(100):逻辑读290703,物理读0,预读读0

顶部(1):https://www.brentozar.com/pastetheplan/?id=B1zwx0klN

顶部(100):https://www.brentozar.com/pastetheplan/?id=Hkx5k0JgE

我怎样才能使Top(1)和Top(100)一样快,为什么这么慢?我以前从未在其他服务器上看到过这种行为,也许是在SQLServer设置上有问题吗?

1 个答案:

答案 0 :(得分:0)

解决方案:

在SSMS执行计划窗口中签出绿色信息消息后,缺少包含选定列的INCLUDE的索引。

CREATE NONCLUSTERED INDEX [] ON [dbo].[FurnaceData] ([LoadIdLowInt],[LoadIdHighInt],[ControlTempZ1PV],[ControlTempZ2PV],[ControlTempZ3PV],[ControlTempZ4PV],[ControlTempZ5PV]) INCLUDE ([Timestmp])

相关问题