在SELECT查询中使用TOP 1的性能影响

And*_*rey 21 sql t-sql sql-server

我有一个User表,其中有Username和Application列.用户名可能重复,但用户名+应用程序的组合是唯一的,但我没有在表上设置唯一约束(性能)

问题:以下两者之间是否存在任何差异(性能方面):

SELECT * FROM User where UserName='myuser' AND Application='myapp'
Run Code Online (Sandbox Code Playgroud)

AND -

SELECT TOP 1 * FROM User where UserName='myuser' AND Application='myapp'
Run Code Online (Sandbox Code Playgroud)

由于Username + Application的组合是唯一的,因此两个查询总是返回不超过一条记录,因此TOP 1不会影响结果.我一直认为添加TOP 1会真正加快速度,因为sql server会停止查找它找到一个匹配项,但我最近在一篇文章中读到使用TOP实际上会减慢速度并且建议避免,尽管它们没有解释原因.

任何意见?

谢谢!安德烈

Joe*_*orn 17

如果结果中有多行而没有ORDER BY子句,则"TOP 1"会为服务器节省大量工作.如果有一个order by子句,服务器仍然必须实现整个结果集,如果只有一行它并没有真正改变任何东西.

  • 对于某些价值观而言,它将在世界上产生重大影响,对其他价值观则没有.当您要求用户和应用程序恰好是表中物理顺序中的第一个时,TOP 1将显得微不足道,因为它将在一条记录后停止扫描.当你在b树的末尾要求用户和应用程序时,TOP 1将没有任何区别.你真正需要的是覆盖索引. (3认同)

Guf*_*ffa 15

您可能会top因使用索引而获得一些性能差异,但使用索引可获得真正的性能.

如果您有UserName和Application字段的索引,则数据库甚至不必触及该表,直到它隔离了单个记录.此外,它已经从表统计中知道值是唯一的,因此使用top没有区别.

  • Guffa写道,"一个独特的索引将减慢插入速度,因为它必须在插入之前检查存在,但差异应该非常小." 同意.差异可能很小,以至于无法衡量.保证唯一性是值得的. (4认同)

cod*_*ike 5

我认为这取决于SQL生成的查询执行计划。在过去的SQL Server版本中,我已经看到使用多余的“ TOP”为具有许多联接的复杂查询带来了明显的性能优势。但绝对不是在所有情况下。

我想我能提供的最佳建议是根据具体情况进行尝试。