Mysql查询表中每行数据大小_计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...
本文出处:
感谢桦仔 的分享精神!
很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间
这里共享一个脚本
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 CURSORFOR
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 tmptbWHERE [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 RowsInfoWHEN 0 THEN 0ELSE 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 CURSORFOR
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 tmptbWHERE [tbspinfo].[nameinfo] = [tmptb].[TableName]ORDER BY CAST(REPLACE([tbspinfo].[reserved], 'KB', '') AS INT) DESC DROP TABLE [#tablespaceinfo]DROP TABLE [#tmptb]
适合于不是默认架构dba的版本
--数据分析适合不是默认架构dbo--在它的基础上做了些修改,适合不同的框架
IF OBJECT_ID('tempdb..#TablesSizes') IS NOT NULL
DROP TABLE #TablesSizes
CREATE TABLE #TablesSizes
(
TableName sysname ,
Rows BIGINT ,
reserved VARCHAR(100) ,
data VARCHAR(100) ,
index_size VARCHAR(100) ,
unused VARCHAR(100)
)
DECLARE @sql VARCHAR(MAX)
SELECT @sql = COALESCE(@sql, '') + 'INSERT INTO #TablesSizes execute sp_spaceused ''' + QUOTENAME(TABLE_SCHEMA,
'[]') + '.'
+ QUOTENAME(Table_Name, '[]') + ''''FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'PRINT ( @SQL )
EXECUTE (@SQL)
SELECT *FROM #TablesSizes
ORDER BY Rows DESC
Mysql查询表中每行数据大小_计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...相关推荐
- 计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...
本文出处: http://www.cnblogs.com/lyhabc/p/3828496.html 感谢桦仔 的分享精神! 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享 ...
- mysql 每条记录大小_计算数据库中各个表的数据量和每行记录所占用空间
很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo VARCHAR(500) , row ...
- mysql 数据透视_把数据库中的数据制作成Excel数据透视表
如果我们在使用Excel的时候,需要把数据库中的数据制作成Excel数据透视表,我们该怎么操作呢?如果数据在数据库中,我们不用把数据导入到工作表中,我们可以直接以数据库的全部数据或者部分数据制作数据透 ...
- datax 持续数据同步_采用DataX实现多表增量数据同步
这两天验证了一下阿里的DataX数据同步工具,觉得DataX可以用来做管理数据的多级数据同步.DataX用来做批量数据迁移很适合,能够保证数据的一致性,性能也很好,结合时间戳字段,用来实现数据定时增量 ...
- mysql单字段更新全字段更新_疑问: 数据库进行更新时 当数据数据相同时 全字段更新和单字段更新是否有区别...
楼上大致正确,但是 1.前者也是通用的,但要多写一些 setXXX 的代码: 2.第二种方式在并发情况下容易导致前面的update失效,除非整个过程加锁: 请求1: update Student se ...
- java中代表人数的单词_计算列表中显示的单词数量
我有一列人们给出的文字游戏答案,以及所有可能正确答案的列表 . 我正在试图弄清楚我如何能够计算出每个人的响应单元格中右边答案列表中有多少单词 . 因此,A列包含人们的响应数据,如下所示: glare, ...
- 『Python开发实战菜鸟教程』实战篇:爬虫快速入门——统计分析CSDN与博客园博客阅读数据
文章目录 0x01:引子 首先介绍一下网络爬虫是什么,可以用来做什么? 这里简单探讨一下网络爬虫的合法性 正式进入爬虫实战前,需要我们了解下网页结构 HTML CSS JScript 写一个简单的 H ...
- mysql数据库插入数据为空_插入数据成功,但是数据库中显示为空(菜鸟提问)...
插入数据成功,但是数据库中显示为空(初学者提问). 这个问题很菜,实在是找不到办法. 为什么往数据库中插入数据显示成功,但是数据库中显示是空. +------+------+ | name | ...
- datagrid如何获取一行数据中的某个字段值_或许是全网最全面关于数据库面试题...
原文: https://www.enmotech.com/web/detail/1/794/1.html 两万字全面论述数据库面试题(上) https://www.enmotech.com/web/d ...
最新文章
- 乳腺MG数据获取(Breast Mammography)
- [LeetCode]--5. Longest Palindromic Substring
- 什么是软件测试架构师?
- 使界面里的组件更圆滑
- VMware Workstation 8正式版下载+密钥序列号
- 2018 总结 2019 展望
- 以太网,局域网,万维网
- Flutter 登录页面Demo 复制可使用
- apt-get安装与卸载
- 没有编辑器时,使用echo更换源
- leetcode探索哈希表(一)
- 《Expert C Programming》(C专家编程)读书笔记
- win10计算机禁用用户账户控制,win10用户账户控制怎么关闭_用户账户控制如何解除win10-win7之家...
- MEncoder的基础用法—6.5. 编码为MPEG格式
- 使用Echarts在网页中显示漂亮图例实战(Bootstrap+Django+ECharts+Jinja2使用入门)
- 百度之星资格赛1003 度度熊与邪恶大魔王
- 2022.10.11
- Coursera | Applied Plotting, Charting Data Representation in Python(UMich)| Assignment4
- JAVA计算机毕业设计桌游店会员管理系统Mybatis+系统+数据库+调试部署
- 试图解释清楚【JavaScript Event Loop】