Использование диска таблицы SQLite

51

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

Теги:

3 ответа

80
Лучший ответ

Вы можете использовать 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, которые можно использовать для создания базы данных со статистикой использования, которую затем можно проанализировать.

  • 0
    Большое вам спасибо! Как раз то, что я искал ...
  • 1
    Осторожно, sqlite3_analyze требует много времени для запуска.
Показать ещё 4 комментария
5

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

$ 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
  • 0
    Это подлый! Я бы предложил добавить комментарий над кодом, который объясняет, что делает фрагмент, это заняло у меня несколько минут.
  • 0
    Вы уверены, что он не скопировал файл внизу? Вакууму требуется столько же дискового пространства, сколько и размер дБ, по крайней мере, я думаю (я не слишком уверен в этом, но некоторые вещи, которые я помню, как я читал, и мои эксперименты с почти полными разделами, заставляют меня поверить что-то в этом роде.)
Показать ещё 1 комментарий
0

Если вы используете 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", и поэтому не будет равен фактическому размеру на диске, но для меня число плюс предполагаемый размер более полезен, чем другие альтернативы, такие как количество страниц.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню