很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间

这里共享一个脚本

CREATE TABLE #tablespaceinfo

(

nameinfo VARCHAR(500) ,

rowsinfo BIGINT ,

reserved VARCHAR(20) ,

datainfo VARCHAR(20) ,

index_size VARCHAR(20) ,

unused VARCHAR(20)

)

DECLARE @tablename VARCHAR(255);

DECLARE Info_cursor CURSOR

FOR

SELECT '[' + [name] + ']'

FROM sys.tables

WHERE type = 'U';

OPEN Info_cursor

FETCH NEXT FROM Info_cursor INTO @tablename

WHILE @@FETCH_STATUS = 0

BEGIN

INSERT INTO #tablespaceinfo

EXEC sp_spaceused @tablename

FETCH NEXT FROM Info_cursor

INTO @tablename

END

CLOSE Info_cursor

DEALLOCATE Info_cursor

--创建临时表

CREATE TABLE [#tmptb]

(

TableName VARCHAR(50) ,

DataInfo BIGINT ,

RowsInfo BIGINT ,

Spaceperrow AS ( CASE RowsInfo

WHEN 0 THEN 0

ELSE DataInfo / RowsInfo

END ) PERSISTED

)

--插入数据到临时表

INSERT INTO [#tmptb]

( [TableName] ,

[DataInfo] ,

[RowsInfo]

)

SELECT [nameinfo] ,

CAST(REPLACE([datainfo], 'KB', '') AS BIGINT) AS 'datainfo' ,

[rowsinfo]

FROM #tablespaceinfo

ORDER BY CAST(REPLACE(reserved, 'KB', '') AS INT) DESC

--汇总记录

SELECT [tbspinfo].* ,

[tmptb].[Spaceperrow] AS '每行记录大概占用空间(KB)'

FROM [#tablespaceinfo] AS tbspinfo ,

[#tmptb] AS tmptb

WHERE [tbspinfo].[nameinfo] = [tmptb].[TableName]

ORDER BY CAST(REPLACE([tbspinfo].[reserved], 'KB', '') AS INT) DESC

DROP TABLE [#tablespaceinfo]

DROP TABLE [#tmptb]

注意:使用之前要计算哪个数据库的记录,请先USE一下要统计表记录数的那个数据库!!

工作中遇到的问题

可以说我在实际的工作中 ,在100个问题中有90个都会先用到这个脚本

这里举一个我本人工作中遇到的一些问题

问题一:

程序员反映数据库查询慢,5分钟还没有出结果

我先用这个脚本看一下这个表有多少记录,大概有1000w+条数据

然后在本地的SSMS里查询,确实也是大概4分钟的样子才出来数据,看一下执行计划,发现查询能使用到索引

看一下数据库的压力,并不是很大,我跟会不会跟数据量有关系呢?

程序员要查询的结果条数是500条数据,业务表是做了分区的,按道理应该不会慢成这样。。。

后来我再看一下共享出来的那个脚本的结果,发现查询的结果大小=每行记录的大小*记录数

要查询大概500MB的数据,再传到客户端,不慢才怪

为什麽查询出的结果这么大?

主要是有几个大字段:例如:二进制字段和NVARCHAR(MAX)

并且时间范围跨度比较大

马上叫程序员改一下查询的语句,由于是entity framework程序,怎麽改我就不太清楚了,主要是不必要的字段就不查询处理并且缩小时间范围

问题二:

还有一些问题也需要知道每行记录的大小,例如删除表的历史数据,QA说要保留2013年之前的数据,你需要查出保留的数据或者2013年之前的数据占用多少G空间

再结合当前服务器的磁盘可用空间,来评估删除的数据是否太多或者太少

那么流程是:先查出2013年之前的记录数有多少-》计算表的总记录数-》计算表的大小-》手工计算每行记录的大小-》乘以2013年之前的记录数

如果没有每行记录数这个字段,那么你手工计算,是不是效率就变慢了???

问题三:

导数据的时候,你想知道当前已经导了多少数据了,那么执行一下这个脚本就可以了,这个脚本基本不会被阻塞

很快就能查出结果

脚本的计算方法

方法一

实际上利用的就是数据行大小的信息除以记录数

CASE RowsInfo

WHEN 0 THEN 0

ELSE DataInfo / RowsInfo

方法二

SELECT AVG(DATALENGTH(C0))+AVG(DATALENGTH(C1))+AVG(DATALENGTH(C2))+AVG(DATALENGTH(C3)) FROM [dbo].[TB106]

说一下两种方法的区别

第一种方法是效率高,当表有上亿条记录的时候,如果你使用第二种方法执行AVG(DATALENGTH(C0))是很慢的,因为SQLSERVER要统计字段大小信息

可能十几分钟都出不来结果

当然,第一种方法也有一些缺陷,就是当表的记录数少的时候,统计出来的每行记录占用空间是不准确的

因为datainfo这个值是以数据页大小为单位的,因为就算表只有一条记录,那么也会占用一个数据页(8KB)

那么当8KB/1 =8KB,一条记录肯定不会是8KB大小的,所以记录少的时候会不准确

但是当记录数很多的时候,就准确了

看一下TB106这个表统计出来的结果值

SELECT AVG(DATALENGTH(C0))+AVG(DATALENGTH(C1))+AVG(DATALENGTH(C2))+AVG(DATALENGTH(C3)) FROM [dbo].[TB106]

可以看到是比较准确的

注意:

无论方法一还是方法二都不包括索引所占用的空间 !!

总结

大家平时一定会想:究竟DBA有什么作用?

在这里就给大家一个例子了,在工作中,程序员是不会关心他要查询的数据的大小的,他不管三七二十一只要把数据select出来就行了,然后收工

DBA这里就要解决数据查询不出来的问题,一般的程序员觉得查询500条数据是很少的,根本不会关心表设计,表的字段的数据类型

当工作越来越多,开发任务越来越重的时候更是这样

所以本人觉得DBA这个角色还是比较重要的o(∩_∩)o

如有不对的地方,欢迎大家拍砖o(∩_∩)o

2014-7-7 脚本bug修复

由于算出来每行记录的精度有问题,我又对脚本的精度进行了改进

CREATE TABLE #tablespaceinfo

(

nameinfo VARCHAR(500) ,

rowsinfo BIGINT ,

reserved VARCHAR(20) ,

datainfo VARCHAR(20) ,

index_size VARCHAR(20) ,

unused VARCHAR(20)

)

DECLARE @tablename VARCHAR(255);

DECLARE Info_cursor CURSOR

FOR

SELECT '[' + [name] + ']'

FROM sys.tables

WHERE type = 'U';

OPEN Info_cursor

FETCH NEXT FROM Info_cursor INTO @tablename

WHILE @@FETCH_STATUS = 0

BEGIN

INSERT INTO #tablespaceinfo

EXEC sp_spaceused @tablename

FETCH NEXT FROM Info_cursor

INTO @tablename

END

CLOSE Info_cursor

DEALLOCATE Info_cursor

--创建临时表

CREATE TABLE [#tmptb]

(

TableName VARCHAR(50) ,

DataInfo BIGINT ,

RowsInfo BIGINT ,

Spaceperrow AS ( CASE RowsInfo

WHEN 0 THEN 0

ELSE CAST(DataInfo AS decimal(18,2))/CAST(RowsInfo AS decimal(18,2))

END ) PERSISTED

)

--插入数据到临时表

INSERT INTO [#tmptb]

( [TableName] ,

[DataInfo] ,

[RowsInfo]

)

SELECT [nameinfo] ,

CAST(REPLACE([datainfo], 'KB', '') AS BIGINT) AS 'datainfo' ,

[rowsinfo]

FROM #tablespaceinfo

ORDER BY CAST(REPLACE(reserved, 'KB', '') AS INT) DESC

--汇总记录

SELECT [tbspinfo].* ,

[tmptb].[Spaceperrow] AS '每行记录大概占用空间(KB)'

FROM [#tablespaceinfo] AS tbspinfo ,

[#tmptb] AS tmptb

WHERE [tbspinfo].[nameinfo] = [tmptb].[TableName]

ORDER BY CAST(REPLACE([tbspinfo].[reserved], 'KB', '') AS INT) DESC

DROP TABLE [#tablespaceinfo]

DROP TABLE [#tmptb]

mysql 每条记录大小_计算数据库中各个表的数据量和每行记录所占用空间相关推荐

  1. Mysql查询表中每行数据大小_计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...

    本文出处: 感谢桦仔 的分享精神! 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo  ...

  2. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)...

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  3. 计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...

    本文出处: http://www.cnblogs.com/lyhabc/p/3828496.html 感谢桦仔 的分享精神! 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享 ...

  4. Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量

    1.统计数据库中总记录条数 select sum(table_rows) from tables where TABLE_SCHEMA = 数据库名称; 2.统计mysql 数据库中所有表的记录数 s ...

  5. mysql删除表中所有数据的语句_sql删除数据库中所有表与数据语句

    来源:转载 如果要删除数据表中所有数据只要遍历一下数据库再删除就可以了,清除所有数据我们可以使用搜索出所有表名,构造为一条SQL语句进行清除了,这里我一一给各位同学介绍. 使用sql删除数据库中所有表 ...

  6. MySQL存个人信息可以吗_mysql数据库中,在修改数据时能否保存操作人员的信息,比如姓名或id,如果能,怎么操作。...

    满意答案 yuliuyifei 2015.04.15 采纳率:50%    等级:8 已帮助:464人 您好,"用mysql作为数据库开发" 在数据枝姿访问这一层,必须是mysql ...

  7. mysql快速复制数据库中所有表及数据至另一个库中

    第一步:新建一个新的数据库(db_copy) CREATE DATABASE `db_copy` DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI; ...

  8. 如何给数据库中的表插入数据?

    @R星校长 为表的所有字段插入数据 向表中插入数据最简单的方法就是使用INSERT语句.INSERT语句需要你声明要插入内容的表(table)名和内容(values). 语法规则为: `INSERT ...

  9. mysql 查询每张表的数据量

    #数据库中所有表的信息 SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA = '数据库名' #数据库中每个表的数据量 SELECT ...

最新文章

  1. srand((unsigned)time(NULL))详解
  2. 如何编译 Linux 内核
  3. ubuntu c/c++ IDE编程环境
  4. 经典递归——斐波那契数列,汉诺塔
  5. C++ kadane算法的实现之二(附完整源码)
  6. FTP服务器搭建下的主动模式和被动模式
  7. Linux命令学习总结:dos2unix - unix2dos
  8. Java反序列化json内存溢出_反序列化JSON时出现线程错误
  9. P3168 [CQOI2015]任务查询系统 主席树 + 差分
  10. paypal如何支付欧元_做印度最好的第三方四方支付网关-在线业务源码服务wefreepay一网打尽...
  11. 如何改变Delphi的快捷键 - DELPHI
  12. h5是什么 www.php.cn,html5是什么?html5有什么用?
  13. 小程序调用API服务
  14. 史上最全GIS相关软件(CAD、FME、Arcgis、ArcgisPro)
  15. ubuntu 刷新频率 如何查看_ubuntu如何调整显示的分辨率和刷新率?
  16. 转:Windows Azure Platform体验(3):Azure AppFabric
  17. android手机的根目录,安卓根目录详解
  18. 君不密则失臣,臣不密则失身,机事不密则害成
  19. Python入门习题大全——词汇表
  20. toLocaleString也太好用了吧!(超方便转千分位,中文数字等)

热门文章

  1. 操作系统:第三章 内存管理2 - 详解虚拟内存,页面置换算法,页面分配策略
  2. JVM从入门到精通(七):GC常用参数,Method Area,JVM调优案例分析
  3. Redis实战(三):Redis的List、Set、Hash、sorted_set、skip list
  4. 【Nginx】Nginx配置文件参数/启动参数详解;启动/停止/重新加载配置命令
  5. 万万没想到,线程居然被饿死了!
  6. 分布式文件系统HDFS解析
  7. qsettings删除注册表_Qt QSettings读取注册表和ini | 学步园
  8. 你不知道LinkedList中的方法
  9. (*长期更新)软考网络工程师学习笔记——Section 10 网络安全
  10. 数据库原理与应用(SQL Server)笔记 第九章 存储过程和触发器