如何在 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代表enumset可能不准确,请注意

【讨论】:

你提到enumset不准确,其他类型呢?例如,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 查询中获取结果集的字节大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个接受查询字符串并返回查询结果集的 UDF

如何从 Pentaho-Kettle 中基于动态选择的 sql 查询中获取结果集?

如何保证mybatis查询的mysql和oracle结果集的key的大小写一致

oracle 如何返回多条记录

使用 GROUP BY 和 ORDER BY pl/sql 获取结果集的 N 到 M 行 [重复]

如何将结果集的多个值获取到 Java 对象中