提高MSSQL数据库性能(1)对比count(*) 和 替代count(*)

原文:提高MSSQL数据库性能(1)对比count(*) 和 替代count(*)

文章准备的数据库: Atricles 表   数据量60690000条数据

ArticleID 主键自增列+自动建立的聚集索引,ATitle nvarchar(100)  Acontent varchar(2000) CreateDate DateTime(8)

首先要说的是:select count(*) from table,那么count(*) 和 count(主键) count(文本列)效率比较:  这里是测试主代码

dbcc freeProcCache  --清空SqlCache

SET STATISTICS io ON

SET STATISTICS time ON

go

----这里是测试语句

go

SET STATISTICS profile OFF

SET STATISTICS io OFF

SET STATISTICS time OFF

那么我们来看看:

SELECT COUNT(*) FROM ATRICLES                          CPU 时间 = 1125 毫秒,占用时间 = 1140 毫秒。

SELECT COUNT(ATRICLEID) FROM ATRICLES           CPU 时间 = 1093 毫秒,占用时间 = 1094 毫秒

SELECT COUNT(ATITLE) FROM ATRICLES                 CPU 时间 = 2266 毫秒,占用时间 = 2267 毫秒

SELECT COUNT(ACONTENT) FROM ATRICLES           CPU 时间 = 2296 毫秒,占用时间 = 2303 毫秒。

Count(*) 是在处了 count(主键) 之外速度最快的  为什么最快其实我也不知道 - -! 猜想可能是SQL自动做了查询优化

那么我们是否一定得要 COUNT(*)呢 不是的 大家看这里:

SELECT ROWS FROM SYSINDEXES WHERE ID = OBJECT_ID(‘ATRICLES‘) AND INDID = 1

那么我们看看它和select count(主键)的比较吧:

首先是Count(主键)

表‘ATRICLES‘。扫描计数 1,逻辑读取 120368 次,物理读取 3 次,预读 120364 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:  CPU 时间 = 2282 毫秒,占用时间 = 21334 毫秒。

其次是 from SYSINDEXES

表 ‘SYSINDEXES‘。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0次,lob 预读 0 次。

SQL Server 执行时间:   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SYSINDEXES 系统表   所有的表 行集 索引信息 存放在这个表中

ID =OBJECT_ID(‘ATRICLES‘) ID的意思是 索引所属的表ID

INDID 表示在聚集索引上查找 因为主键在建立的时候已经自动的建立了聚集索引

ROWS 基于 indid = 0 和 indid = 1 的数据级行计数,如果 indid >1,则该值包含重复的计数。

这篇文章想说的是: 在分页情况下 可以考虑使用上面语句查找数据行   AND  count(*) 并不是低效率的 感谢下面朋友指教

本文结束  晚安


原文地址:https://www.cnblogs.com/lonelyxmas/p/9080504.html

时间: 2024-10-13 05:06:25

提高MSSQL数据库性能(1)对比count(*) 和 替代count(*)的相关文章

优化MySQL数据库性能的八大方法

本文探讨了提高MySQL 数据库性能的思路,并从8个方面给出了具体的解决方法. 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小.例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了.同样的,如果可以的话,我们应该

count(1),count(*),count(主键) 性能对比

前言 前段时间关于统计数量的sql问题和朋友进行了讨论,网上关于这三种查询方式说法不一,主要有以下两种说法. count(*) = count(主键) > count(1) count(主键) > count(*) > count(1) 今天对这三种方式进行探究. 数据库为mysql 5.7.12,引擎为InnoDB. 建表 CREATE TABLE `user` (   `id` int(32) NOT NULL AUTO_INCREMENT,   `name` varchar(500

使用JDBC如何提高访问数据库的性能?

1. 使用数据连接池(Connection Pool), 避免使用DriverManager.getConnection. 2. 合理的配置数据连接池参数,设置数据连接池的初始大小,最大连接数,连接超时时间等. 3. 选择合适的事务等级,按照不同的数据库操作类型选择不同的事务等级. 4. 及时关闭Connection,不关闭的话会严重影响系统的性能,甚至造成系统罢工. 5. 优化Statement 1) 选择合适的Statement, 根据不同的数据库操作选择Statement, Prepare

如何对比迁移前后的Oracle数据库性能

有越来越多的数据库都需要要迁移.如何衡量前后的数据库性能成了一个难点.本文使用AWR Compare Report来解决这个问题. 以下皆为测试库内容 环境描述 SID DBID OS 描述 finally 4033498616 windows 7 x64 假设为迁移后的数据库 zhadanren 97461353 Solaris Sparc 6 x64 假设为迁移前的数据库 过程 详细过程如下 导出snapshot数据 注意: 这里导出的snapshot最好包含业务最忙时的时间段,以便于更准确

如何提高数据库性能

一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程师的团队

转载:SqlServer数据库性能优化详解

本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小,使每个查询的响应时间最短并最大限度地提高整个数据库服务器的吞吐量.为达到此目的,需要了解应用程序的需求和数据的逻辑和物理结构,并在相互冲突的数据库使用之间(如联机事务处理 (OLTP) 与决策支持)权衡. 对性能问题的考虑应贯穿于开发阶段的全过程,不应只在最后实现系统时才考虑性能问题.许多使性能得

Mysql数据库性能优化大总结

目录:[TOC] 影响数据库服务器性能的因素 超高的QPS(每秒钟处理的查询量)和TPS导致SQL处理效率下降. 大量的并发导致的数据库连接数被占满和超高的CPU占用率导致资源耗尽服务器宕机. 磁盘IO性能瓶颈导致数据传输效率下降,计划任务导致磁盘IO下降. 网卡IO性能瓶颈,要减少从服务器数量,缓存要分级,避免使用 select * 这样的查询. 大表导致的问题: 不同数据库引擎对于大表的概念是不一样的. InnoDB存储引擎没有明确的大表概念. 实际使用中发现当一个数据表中的数据超过千万行的

Redis各种数据结构性能数据对比和性能优化实践

很对不起大家,又是一篇乱序的文章,但是满满的干货,来源于实践,相信大家会有所收获.里面穿插一些感悟和生活故事,可以忽略不看.不过听大家普遍的反馈说这是其中最喜欢看的部分,好吧,就当学习之后轻松一下. Redis各种数据结构性能数据对比 测试工具:perf4j 性能指标:平均值,最小值,最大值,方差 对比将814条数据按单条插入到哈希MAP和哈希SET: 对比从814条数据的哈希MAP和哈希SET中判断一个元素是否存在(map的hasKey和set的isMember): 大量数据插入哈希MAP,运

Oracle常用导出导出命令及性能效率对比

说明 Oracle导入导出命令主要有EXPDP和IMPDP.EXP和IMP,区别如下:EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用.EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用.IMP只适用于EXP导出的文件,不适用于EXPDP导出文件:IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件.expdp或impdp命令时,可暂不指出用户名/密码@实例名as 身份,然后根据提示再输入,如:expdp schem