【问题标题】:SQL performance of count with where clause vs select使用 where 子句与 select 的 count 的 SQL 性能
【发布时间】:2014-11-13 19:16:50
【问题描述】:

我正在更新一些首先运行查询的代码(我没有编写),例如

SELECT COUNT(*) 
  FROM dbo.APP_Person as Person
 WHERE Person._pk > 0 
   AND Person.last_name LIKE 'LName%' 
   AND Person.first_name LIKE 'FName%' 
   AND Person._pk IN (SELECT _pk FROM dbo.APP_PersonView )

如果结果计数不是太大,它稍后会运行大致相同的查询,但使用 SELECT Person._pk 代替 SELECT COUNT(*)。否则,用户会被告知细化选择集并重试。

(要检查的字段和要比较的值来自用户输入。)

是否有充分的理由不简单地运行第二个表单并查看结果的大小,所以我不需要运行两次查询? SELECT COUNT(*) 会比 SELECT Person._pk(主键)快那么多吗?

这将在 SQLserver 2005 或更高版本下运行,可能是 2008 或更高版本。这张桌子相当大。

【问题讨论】:

  • yes count(*) 将比选择特定列更快
  • @RADAR 我认为COUNT(Person._pk) 将提高性能,因为它在单列上
  • 不,@Ganesh_Devlekar,你应该无法比COUNT(*) 更有效地计数,因为COUNT(*) 不必查看任何列。
  • 很多关于 COUNT([Column]) 与 COUNT(*) 差异的有用讨论可以在 here 找到

标签: sql-server performance sql-server-2008 count


【解决方案1】:

是的,有一个很好的理由不简单地运行第二个表单并查看结果的大小:如果不扫描整个结果集,就无法获得结果的大小.

您可以将结果视为足够少,直到证明太多,但如果该处理成本很高,那么这不一定是更好的选择。除非这已被证明是您系统的瓶颈,否则您可能有比尝试改进它更好的事情要做。

【讨论】:

  • 谢谢。这个项目是一个瓶颈,并且正在减慢用户的速度。请注意,该应用程序不是用 SQL 编写的,它会将孤立的 SQL 调用发送到 SQLserver,并获取块中任何单个调用的结果。一旦我有了一个结果块,确定行数就变得快速而简单,它位于关于返回数据对象的元数据中。
  • 我回答了您提出的问题,并提供了一个可能更适合您的替代方案。如果您确信您的想法是最好的,那么为什么不进行更改和测试呢?特别要确保测试返回太多结果的场景。并且不要忘记检查在其他情况下有多少改进。
猜你喜欢
  • 2021-05-16
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多