Как получить размер набора результатов в байтах в SQL-запросе?

Можно ли получить размер в байтах результатов sql-запроса в MySQL?

Например:

select * from sometable;

ths возвращает 10000 строк. Мне нужны не строки, а размер набора результатов в байтах. Является ли это возможным?


person Raj    schedule 24.12.2010    source источник
comment
Просто интересно, зачем вам это нужно?   -  person zerkms    schedule 24.12.2010
comment
Чтобы узнать, сколько строк нужно получить и обработать в фоновом процессе. Я нахожусь в среде, где память ограничена, и выборка слишком большого количества строк приведет к сбою процесса. Я пытаюсь обработать как можно больше строк, насколько это позволяет ограничение памяти.   -  person Raj    schedule 24.12.2010
comment
А что вам может дать информация о размере данных was? Если вы влезете в память - тогда все в порядке, если нет - то вы никогда не получите результатов о том, насколько велики были данные. Вы не можете предсказать размер возвращаемых данных.   -  person zerkms    schedule 24.12.2010
comment
Нам нужен подсчет всех строк в результирующем наборе с точностью до байта, потому что мы выставляем счета клиентам за объем данных, хранящихся от их имени. По разным причинам приближения недостаточно. Было бы неплохо, если бы мы могли сделать это напрямую, используя MySQL function/sproc.   -  person Mike Gleason    schedule 15.08.2018


Ответы (4)


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 может быть неточным, обратите внимание

person ajreal    schedule 24.12.2010
comment
Вы упомянули, что enum и set неверны, как насчет других типов? Например, int можно представить как строку длиной от 1 до 10, но в MySQL она всегда занимает 4 байта. Кроме того, следуя этому аргументу, можно ли предположить, что для достаточно больших наборов данных char_length всегда будет завышать общий размер? - person iloo; 16.01.2017
comment
Примечание. Ваш результат будет NULL, если какой-либо из ваших столбцов пуст. Рассмотрите возможность суммирования только столбцов, которые, как вы знаете, имеют длину, или используйте if/else для замены пустых столбцов нулем, чтобы избежать любых значений NULL. - person Matthew; 10.05.2018

Чтобы использовать решение Анджелина, если ваши данные содержат нули, вам нужно добавить 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
person futilerebel    schedule 16.05.2014

упростить :

select sum(char_length(column1)+
    char_length(column2)+
    char_length(column3)+
    char_length(column4) ... )<-- repeat for all columns
   from your_table

Вам нужно добавить IFNULL() в каждый столбец, как упомянул @futilerebel

person Angelin Nadar    schedule 24.12.2010

CHAR_LENGTH() получает количество символов, если unicode будет больше байтов - используйте LENGTH() для количества байтов: https://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_length

person GrahamB    schedule 03.03.2015