【问题标题】:Does Adding "TOP 1" to a sql statement increase performance signficantly?在 sql 语句中添加“TOP 1”会显着提高性能吗?
【发布时间】:2010-02-12 19:39:57
【问题描述】:

在 SQL 查询中,是否将“TOP 1”添加到

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

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

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

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

【问题讨论】:

  • 您可以随时使用分析器进行尝试。
  • 很遗憾,我没有在此服务器上运行分析器的访问权限。

标签: c# sql linq-to-sql


【解决方案1】:

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

【讨论】:

  • 为什么不SingleOrDefault,因为如果没有找到记录,Single 也会抛出异常?当没有找到记录时,SingleOrDefault 将返回 null。
  • 好吧,Single() 本质上断言只有一条记录,所以如果你的代码的其余部分期望这样,你不必费心编写所有的空检查并自己抛出异常。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        SingleFirst 有不同的用途。

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

        如果您基于主键或唯一索引进行查询,则查询优化器无论如何都会删除“TOP ... N”子句。

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

        【讨论】:

          【解决方案6】:

          我有一个包含超过 700 万条记录的表,如果我选择所有行,即使使用聚集索引,相对成本也会高得多,我认为您的问题可能包括有关您正在尝试的实际查询以及原因的更多信息,例如,从具有 10 行的表返回前 1 行与返回全部 10 行提供的性能提升可以忽略不计,如果您的表有 700 万行,则完全是另一回事。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 我不知道它实际上会做什么,但是如果没有 ORDER BY,为什么还要进行排序呢?
            • 如果我不使用“ORDER BY”,它还会排序吗?
            • 为什么只使用 TOP 1 会调用排序?
            • @Joeforker - 这就是我说“可能”的原因。它可能并不总是,但它可以。
            • @Randy——它的排序会减慢它的速度,而不是使用 TOP。仅仅因为您在排序时经常使用 TOP,并不意味着使用 TOP 本身会降低您的查询速度。
            猜你喜欢
            • 2011-03-25
            • 2023-03-11
            • 1970-01-01
            • 2012-09-12
            • 1970-01-01
            • 2016-01-08
            • 1970-01-01
            • 2017-02-10
            • 1970-01-01
            相关资源
            最近更新 更多