当前位置: 首页 > news >正文

【SQL Server】中关于 COUNT 的一些使用方式区别

前言

使用 SQL Server时,对表或查询结果计算行数是一种常见的操作。了解一些使用 COUNT(*)、COUNT(1) 和 DISTINCT COUNT等的区别对于编写经过优化的高效查询至关重要。本文我们一起探讨这些使用COUNT方式,了解它们的差异与使用。

方式差异

1、COUNT(*)

描述:用于计算表中的所有行或查询的结果集,此方式使用包括 NULL 值和重复项。由于它其简单性,所以成为最常用和推荐的方式。

效率:由于其不需要计算任何特定列值,性能非常高效。【因为SQL Server 通过利用表的元数据来优化此操作,使其比对特定列进行计数更快,尤其是当这些列很大或包含复杂数据类型时。】

场景:对表或结果集中的所有行进行计数


SELECT COUNT(*) AS TotalRows
FROM Student WITH(NOLOCK)SELECT COUNT(*) AS TotalRows
FROM Student WITH(NOLOCK) 
WHERE CreateDate>='2024-09-01'

2、COUNT(1)

描述:此操作与COUNT()类似,但它通过计算每行的常量值 1 来计算行数。貌似是一种为了提高性能的技巧,实际上与COUNT()没有显著差异。因为现在的SQL Server通常会将其优化为COUNT()相同的执行计划,所以性能基本相同。

效率:从性能角度来看,COUNT(1) 和 COUNT() 通常是等效的。【因为SQL Server 优化器以相同的方式处理它们,并生成类似的执行计划。】

场景:经常互换使用,在 COUNT(1) 与 COUNT(*) 之间选择根据是首选项或编码标准,而不是性能问题。

SELECT COUNT(1) AS TotalRows
FROM Student WITH(NOLOCK)SELECT COUNT(1) AS TotalRows
FROM Student WITH(NOLOCK) 
WHERE CreateDate>='2024-09-01'

3、COUNT(列名)

描述:用于计算指定列中非 NULL 值的所有行数,当我们需要计算列中不含 NULL 值的行数量时,此方式就非常有用。由计算时需要检查行指定列是否为NULL的运算,所以性能可能略低于前两者。

效率:从性能角度来看,可能不如COUNT(*) 或COUNT(1)。【如果指定列已编制索引,则 SQL Server 可以利用该索引来提高性能。】

场景:对特定列中的非 NULL 值计算行数,且在使用时,务必考虑列的大小和复杂性。

SELECT COUNT(remark) AS TotalRows
FROM orders WITH(NOLOCK)SELECT COUNT(remark) AS TotalRows
FROM Orders WITH(NOLOCK)
WHERE CreateDate>='2024-10-01'

4、COUNT(DISTINCT 列名)

描述:用于计算指定列中非重复 NULL 值的行数,此方式对于识别数据集中指定列唯一性的数量非常有用。

效率:由于它需要对指定列的值进行排序与去重,所以会占用更多的资源,从而也影响性能(特别是大型数据集或具有许多不同值的列,影响更明显)。【在列上使用索引可能会有所帮助,但可能无法完全减轻开销。】

场景:对指定列中的唯一非 NULL 值计算行数

SELECT COUNT(DISTINCT CustomerId) AS TotalRows
FROM Orders WITH(NOLOCK)SELECT COUNT(DISTINCT CustomerId) AS TotalRows
FROM Orders WITH(NOLOCK)
WHERE CreateDate>='2024-10-01'

小结

了解 COUNT 方法的几种使用方式间的区别,对于开发或数据库管理员来说非常重要。每种方式都有特定的用途,并具有独特的性能特征。希望通过本文的内容对你在选择适当的 COUNT 使用方式有所收获!,如有不到之处,请多多包涵。


http://www.mrgr.cn/news/59397.html

相关文章:

  • cookie 简介
  • a50股指期货是什么意思?
  • VUE前端按钮添加遮罩层
  • C++基础:变量的合法性和三数字比较
  • SMT 生产可视化:提升电子组装流程效率
  • 了解elasticsearch
  • 道路车辆功能安全 ISO 26262标准(9-1)—面向汽车安全完整性等级 (ASIL) 和安全的分析
  • Java 中的 `final` 关键字详解
  • Agent与大模型的区别
  • 基于Python的自然语言处理系列(45):Sentence-BERT句子相似度计算
  • Linux初阶——信号
  • 如何提高英语口语表达能力?
  • 「C/C++」番外篇 之 软件版本号详解
  • 【传知代码】短期电力负荷(论文复现)
  • 油豆视频油豆影视app系统源码-试看/付费/免费/vip
  • 一款基于.NET8开源且免费的中小型酒店管理系统
  • Scala 字符串
  • SQLI LABS | Less-11 POST-Error Based-Single quotes-String
  • 详解Apache版本、新功能和技术前景
  • React Query已过时?新一代请求工具横空出世
  • sass软件登录设定——未来之窗行业应用跨平台架构
  • C#与C++交互开发系列(十二):托管和非托管内存管理策略
  • ArcGIS003:ArcMap常用操作0-50例动图演示
  • 【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法
  • Rust 生命周期
  • 国内基础大模型的独立性及应用大模型的依赖性