【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 使用方式有所收获!,如有不到之处,请多多包涵。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906181.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务实战系列之玩转Docker(十六)

导览 前言Q:基于容器云如何实现高可用的配置中心一、etcd入门1. 简介2. 特点 二、etcd实践1. 安装etcd镜像2. 创建etcd集群2.1 etcd-node12.2 etcd-node22.3 etcd-node3 3. 启动etcd集群 结语系列回顾 前言 Docker,一个宠儿,一个云原生领域的…

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入 Med-BERT:pretrained contextualized embeddings on large-scale structured electronic health records for disease prediction ​ ​ 摘要:基于电子健康记录(EHR)的深度学习(DL)预…

API接口开放与安全管控 - 原理与实践

API安全是接口开放的前提条件 在API对外开放时,确保其安全性至关重要,因为API直接暴露给外部环境,容易成为攻击目标。一旦被恶意利用,可能导致数据泄露、服务滥用等严重后果。因此,通过API网关实施严格的接口安全管理…

python实现钉钉群机器人消息通知(消息卡片)

直接上代码 python """ 飞书群机器人发送通知 """ import time import urllib3 import datetimeurllib3.disable_warnings()class DingTalkRobotAlert():def __init__(self):self.webhook webhook_urlself.headers {Content-Type: applicatio…

32位汇编——通用寄存器

通用寄存器 什么是寄存器呢? 计算机在三个地方可以存储数据,第一个是把数据存到CPU中,第二个把数据存到内存中,第三个把数据存到硬盘上。 那这个所谓的寄存器,就是CPU中用来存储数据的地方。那这个寄存器有多大呢&a…

强大的接口测试可视化工具:Postman Flows

Postman Flows是一种接口测试可视化工具,可以使用流的形式在Postman工作台将请求接口、数据处理和创建实际流程整合到一起。如下图所示 Postman Flows是以API为中心的可视化应用程序开发界面。它提供了一个无限的画布用于编排和串连API,数据可视化来显示…

JavaScript 实战技巧:让你成为前端高手的必备知识3(进阶版)

一、DOM概述 (一)DOM操作 是指使用‌JavaScript操作文档对象模型(Document Object Model)的过程。‌文档对象模型是一种表示网页文档结构的方式,它将整个网页文档表示为一个树形结构,每个元素都是一个节点…

Python 网络爬虫教程:从入门到高级的全面指南

Python 网络爬虫教程:从入门到高级的全面指南 引言 在信息爆炸的时代,网络爬虫(Web Scraping)成为了获取数据的重要工具。Python 以其简单易用的特性,成为了网络爬虫开发的首选语言。本文将详细介绍如何使用 Python …

【抖音】a_bogus参数逆向分析

抖音回复评论: 点击——展开xxx条回复﹀就会出现 https://www.douyin.com/aweme/v1/web/comment/list/reply 直接搜又搜不到 分析调用堆栈 可以看到这个栈是有请求相关的数据的 上面一个栈 所以就是在bdms.js里面生成的 就在这里打上日志断点:“T…

基于SpringBoot的宠物健康咨询系统的设计与实现

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,宠物健康知识信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不…

基于大语言模型(LLM)自主Agent 智能体综述

近年来,LLM(Large Language Model)取得了显著成功,并显示出了达到人类智能的巨大潜力。基于这种能力,使用LLM作为中央控制器来构建自助Agent,以获得类人决策能力。 Autonomous agents 又被称为智能体、Agent。指能够通过感知周围环境、进行规划以及执行动作来完成既定任务。…

jmeter脚本-请求体设置变量and请求体太长的处理

目录 1、查询接口 1.1 准备组织列表的TXT文件,如下: 1.2 添加 CSV数据文件设置 ,如下: 1.3 接口请求体设置变量,如下: 2、创建接口 2.1 见1.1 2.2 见1.2 2.3 准备创建接口的请求体TXT文件&#xff…

elasticsearch 8.x 插件安装(六)之Hanlp插件

elasticsearch 8.x 插件安装(六)之Hanlp插件 elasticsearch插件安装合集 elasticsearch插件安装(一)之ik分词器安装(含MySQL更新) elasticsearch 8.x插件(二)之同义词安装如何解决…

2024Python安装与配置IDE汉化教程

【一】Python解释器下载【运行环境】 【1】Python官网 [https://www.python.org](官网进不去的可以点击点击领取,100%免费!安装包) 包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】! 【…

华为自研仓颉编程语言官网上线 首个公测版本开放下载

仓颉编程语言官网正式公开上线,同时首个公测版本开放下载。本次仓颉编程语言官网上线了首页、在线体验、文档、学习、下载、动态以及三方库共六个模块,可供开发和学习和体验。 据悉,仓颉编程语言是在今年6月的华为开发者大会上正式公布&…

论文翻译 | PROMPTAGATOR : FEW-SHOT DENSE RETRIEVAL FROM 8 EXAMPLES

摘要 最近的信息检索研究主要集中在如何从一个任务(通常有丰富的监督数据)转移到其他各种监督有限的任务上,其隐含的假设是从一个任务可以泛化到所有其他任务。然而,这忽略了这样一个事实,即存在许多多样化和独特的检索…

Virtuoso使用layout绘制版图、使用Calibre验证DRC、LVS、PEX抽取RC

1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后,在原理图界面点击Launch,点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找到Generate All from Source。 2、在Generate Layout界面,选中“Instance”&#…

微信小程序服务通知

项目中用到了小程序的服务消息通知,通知订单状态信息,下边就是整理的一下代码,放到项目中,把项目的小程序appid和小程序的secret写进去,直接运行即可 提前申请好小程序服务信息通知短信模板,代码需要用到模…

QT(图表)

目录 QChart的继承关系 基本组件和概念 常见图表类型及其系列类 常用的图表配置 一、折线图示例 二、柱状图示例 三、饼图示例 四、类波形图(折线图)示例 QChart 模块提供了直观的图表绘制接口,支持创建各种常见的图表类型&#xff0…

day13:FTP服务

一,FTP概述 概述 FTP(File Transfer Protocol,文件传输协议)是用于在计算机之间传输文件的协议。它工作在网络的应用层,通过 TCP 协议进行数据传输,默认端口号为 21(命令端口,另外…