【问题标题】:How to get the byte size of resultset in an SQL query?如何在 SQL 查询中获取结果集的字节大小?
【发布时间】:2011-05-30 06:28:25
【问题描述】:

是否可以在 MySQL 中获取 sql 查询结果的大小(以字节为单位)?

例如:

select * from sometable;

ths 返回 10000 行。我不想要行,而是结果集的大小(以字节为单位)。有可能吗?

【问题讨论】:

  • 只是好奇,你为什么需要这个?
  • 找出在后台进程中获取和处理多少行。我处于内存有限的环境中,获取太多行会使进程崩溃。我正在尝试在内存限制允许的范围内处理尽可能多的行。
  • 关于数据大小的信息能给你什么?如果你适合内存——那么没关系,如果你不适合——那么你永远不会得到关于数据有多大的结果。您无法预测将返回的数据的大小。
  • 我们需要对结果集中的所有行进行字节精确计数,因为我们会根据客户代表他们存储的数据量向客户收费。由于各种原因,近似值是不够的。如果我们可以直接使用 MySQL 函数/sproc 来执行此操作,那就太好了。

标签: sql mysql rdbms


【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多