Использование диска таблицы SQLite - PullRequest
53 голосов
/ 05 мая 2011

Как узнать использование диска одной таблицей внутри базы данных SQLite, не копируя ее в новую пустую базу данных?

Ответы [ 4 ]

78 голосов
/ 11 февраля 2012

Вы можете использовать sqlite3_analyzer из http://www.sqlite.org/download.html.

Это действительно классный инструмент.Он показывает количество страниц, используемых каждой таблицей с индексами и без них (каждая страница по умолчанию составляет 1024 байта).

Это пример вывода sqlite3_analyzer для базы данных Northwind:

*** Page counts for all tables with their indices ********************

EMPLOYEES............................. 200         34.4% 
ORDERS................................ 152         26.2% 
CATEGORIES............................ 90          15.5% 
ORDER DETAILS......................... 81          13.9% 
CUSTOMERS............................. 17           2.9% 
SQLITE_MASTER......................... 11           1.9% 
PRODUCTS.............................. 7            1.2% 
SUPPLIERS............................. 7            1.2% 
TERRITORIES........................... 6            1.0% 
CUSTOMERCUSTOMERDEMO.................. 2            0.34% 
CUSTOMERDEMOGRAPHICS.................. 2            0.34% 
EMPLOYEETERRITORIES................... 2            0.34% 
REGION................................ 2            0.34% 
SHIPPERS.............................. 2            0.34% 

Он также генерирует операторы SQL, которые можно использовать для создания базы данных со статистикой использования, которую затем можно проанализировать.

4 голосов
/ 12 января 2017

Я понимаю, что этот ответ полностью нарушает дух вопроса, но он дает вам размер без копирования файла ...

$ ls -lh db.sqlite
-rw-r--r-- 1 dude bros 44M Jan 11 18:44 db.sqlite
$ sqlite3 db.sqlite
sqlite> drop table my_table;
sqlite> vacuum;
sqlite> ^D
$ ls -lh db.sqlite
-rw-r--r-- 1 dude bros 23M Jan 11 18:44 db.sqlite
2 голосов
/ 04 февраля 2019

Если вы работаете в linux или OSX или иным образом имеете доступ к утилитам unix awk (и, возможно, sort), вы можете сделать следующее, чтобы получить количество и приблизительный размер с помощью анализа дампа:

# substitute '.dump' for '.dump mytable' if you want to limit to specific table
sqlite3 db.sqlite3 '.dump' | awk -f sqlite3_size.awk | sort -k3 -n -r

который возвращает:

table            count   est. size
my_biggest_table 1090    60733958
my_table2        26919   7796902
my_table3        10390   2732068

и использует скрипт awk:

/INSERT INTO/ {                              # parse INSERT commands
    split($0, name, "\"");                   # extract "xxx" from INSERT INTO "xxx"
    split($0, values, "VALUES");             # extract everything after VALUES
    gsub(/[\047,]/, "", values[2]);          # remove single-quotes and commas
    sizes[name[2]] += length(values[2]) - 3; # subtract 3 for parens and semicolon
    counts[name[2]] += 1;
}

END {
    print "table\tcount\test. size"
    for(k in sizes) {
        # print and sort in descending order
        print k "\t" counts[k] "\t" sizes[k] | "sort -k3 -n -r";
    }
}

Предполагаемый размер основан на длине строки команды «INSERT INTO» и поэтому не равенфактический размер на диске, но для меня подсчет плюс предполагаемый размер более полезен, чем другие альтернативы, такие как подсчет страниц.

0 голосов
/ 04 апреля 2019

Я столкнулся с проблемами с другими ответами здесь (а именно sqlite_analyzer не работает на Linux). 'Закончилось создание следующей функции Bash для (временной) записи каждой таблицы на диск для оценки размера на диске. Технически это копирование БД, что не соответствует духу вопроса ОП, но оно дало мне информацию, за которой я следовал.

function sqlite_size() {
  TMPFILE="/tmp/__sqlite_size_tmp"
  DB=$1
  IFS=" " TABLES=`sqlite3 $DB .tables`
  for i in $TABLES; do
    \rm -f "$TMPFILE"
    sqlite3 $DB ".dump $i" | sqlite3 $TMPFILE
    echo $i `cat $TMPFILE | wc -c`
    \rm -f "$TMPFILE"
  done
}

Пример:

$ sqlite_size sidekick.sqlite
SequelizeMeta 12288
events 16384
histograms 20480
programs 20480

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...