如何在 SQL 查询中获取结果集的字节大小?
Posted
技术标签:
【中文标题】如何在 SQL 查询中获取结果集的字节大小?【英文标题】:How to get the byte size of resultset in an SQL query? 【发布时间】:2011-05-30 06:28:25 【问题描述】:是否可以在 mysql 中获取 sql 查询结果的大小(以字节为单位)?
例如:
select * from sometable;
ths 返回 10000 行。我不想要行,而是结果集的大小(以字节为单位)。有可能吗?
【问题讨论】:
只是好奇,你为什么需要这个? 找出在后台进程中获取和处理多少行。我处于内存有限的环境中,获取太多行会使进程崩溃。我正在尝试在内存限制允许的范围内处理尽可能多的行。 关于数据大小的信息是能给你什么?如果你适合内存——那么没关系,如果你不适合——那么你永远不会得到关于数据有多大的结果。您无法预测将返回的数据的大小。 我们需要对结果集中的所有行进行字节精确计数,因为我们会根据客户代表他们存储的数据量向客户收费。由于各种原因,近似值是不够的。如果我们可以直接使用 MySQL 函数/sproc 来执行此操作,那就太好了。 【参考方案1】:select sum(row_size)
from (
select
char_length(column1)+
char_length(column2)+
char_length(column3)+
char_length(column4) ... <-- repeat for all columns
as row_size
from your_table
) as tbl1;
char_length
代表enum
,set
可能不准确,请注意
【讨论】:
你提到enum
和set
不准确,其他类型呢?例如,int
可以表示为长度从 1 到 10 的字符串,但在 MySQL 中它总是占用 4 个字节。此外,根据这一论点,是否可以假设对于足够大的数据集char_length
总是会高估总大小?
注意:如果您的任何列为空,您的结果将为 NULL。考虑只对你知道有长度的列求和,或者使用 if/else 将空列替换为零,这样你就可以避免任何 NULL 值。【参考方案2】:
在 Angelin 的解决方案的基础上,如果您的数据包含空值,您需要将 IFNULL 添加到每一列:
select sum(
ifnull(char_length(column1), 0) +
ifnull(char_length(column2), 0) +
ifnull(char_length(column3), 0) +
ifnull(char_length(column4), 0) ... <-- repeat for all columns
)
from your_table
【讨论】:
【参考方案3】:简化:
select sum(char_length(column1)+
char_length(column2)+
char_length(column3)+
char_length(column4) ... )<-- repeat for all columns
from your_table
正如@futilerebel 提到的,您需要将 IFNULL() 添加到每一列
【讨论】:
【参考方案4】:CHAR_LENGTH()
获取字符数,如果 unicode 将是更多字节 - 使用 LENGTH()
作为字节数:https://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_length
【讨论】:
以上是关于如何在 SQL 查询中获取结果集的字节大小?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Pentaho-Kettle 中基于动态选择的 sql 查询中获取结果集?
如何保证mybatis查询的mysql和oracle结果集的key的大小写一致