将“TOP 1”添加到sql语句会显着提高性能吗?

在SQL查询中,添加“TOP 1”

SELECT TOP 1 [values] FROM [TABLE] where [TABLE].Value = "ABC" 

当我知道这些记录中只有一个时,我会提高性能吗? 具体来说,我正在考虑LinqToSql和方法之间的区别.Single(...).First(...) ,其中.First(...)TOP 1添加到生成的sql中。

LinqToSql已经感觉很慢,所以我只是想办法让它更快。

编辑: [TABLE].Value可能是某些情况下的外键。

TOP 1选择应该在找到第一个结果后终止,所以,是的,它可能会更快,具体取决于您的查询。 另一方面,您确实想要考虑数据中未检测到的不一致性的语义和潜在含义。 如果真的只有一个匹配,Single()是最合适的。 如果您有多个匹配且正在使用Single(),您将获得exception并被告知数据或代码中的错误。 在你的情况下,我使用Single()。 为了使查询更快,我会考虑在我用作鉴别器的列上添加索引。

我使用SQL Server的经验告诉我,它使您的查询运行得更快。

为什么不在列上添加UNIQUE索引?

在某些情况下,添加“TOP”子句可能有所帮助 – 如果SQL Server预期查询可能返回大量结果,则可能会将表锁定在预期中。 如果您知道情况并非如此并且可以限制TOP,则不会增加该开销。

SingleFirst有不同的用途。

Single适用于您描述的情况。 您总是希望您的代码“尽早失败”。

如果您根据主键或唯一索引进行查询,查询优化器将会删除“TOP … N”子句。

在其他情况下, TOP 1 可能会产生积极的性能影响,但如果这不是您想要做的,请不要这样做。

我有一个包含超过700万条记录的表,如果选择所有行,即使使用聚簇索引,相对成本也要贵得多,我认为您的问题可能包含有关您正在尝试的实际查询的更多信息以及为什么,例如,如果你的表有700万行,那么从10行的表中返回前1并且返回所有10会提供可忽略的性能提升,完全是另一个故事。

不,它可能会使您的查询变慢,因为可能必须先进行排序。