programing

SQLite 테이블 디스크 사용량

sourcetip 2021. 1. 14. 23:44
반응형

SQLite 테이블 디스크 사용량


새로운 빈 데이터베이스에 복사하지 않고 SQLite 데이터베이스 내 단일 테이블의 디스크 사용량을 어떻게 알 수 있습니까?


https://www.sqlite.org/download.html 에서 sqlite3_analyzer사용할 수 있습니다 .

정말 멋진 도구입니다. 인덱스가 있거나없는 각 테이블에서 사용하는 페이지 수를 보여줍니다 (기본적으로 각 페이지는 1024 바이트).

다음은 Northwind 데이터베이스에 대한 sqlite3_analyzer 출력 샘플입니다.

*** 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 문을 생성하여 분석 할 수 있습니다.


나는이 대답이 질문의 정신을 완전히 위반한다는 것을 알고 있지만 파일 복사 하지 않고도 크기를 얻습니다 ...

$ 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

Linux 또는 OSX를 사용 중이거나 다른 방법으로 유닉스 유틸리티 awk (및 선택적으로 정렬)를 사용할 수있는 경우 다음을 수행하여 덤프 분석을 통해 개수와 예상 크기를 얻을 수 있습니다.

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

다음을 반환합니다.

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, values, "VALUES");             # extract everything after VALUES
    split(values[1], name, "INSERT INTO");   # get tablename
    tablename = name[2];                     #
    gsub(/[\047\042]/, "", tablename);         # remove single and double quotes from name
    gsub(/[\047,]/, "", values[2]);          # remove single-quotes and commas
    sizes[tablename] += length(values[2]) - 3; # subtract 3 for parens and semicolon
    counts[tablename] += 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";

        # or, if you don't have the sort command:
        print k "\t" counts[k] "\t" sizes[k];
    }
}

예상 크기는 "INSERT INTO"명령의 문자열 길이를 기반으로하므로 디스크의 실제 크기와 같지는 않지만 페이지 수와 같은 다른 대안보다 count + 예상 크기가 더 유용합니다.


여기서 다른 답변에 문제가 발생했습니다 (즉, Linux에서 작동하지 않는 sqlite_analyzer). '디스크상의 크기를 평가하는 방법으로 (일시적으로) 각 테이블을 디스크에 쓰는 다음 Bash 함수를 생성했습니다. 기술적으로 이것은 OP의 질문의 정신이 아닌 db를 복사하는 것이지만 내가 원하는 정보를 제공했습니다.

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

ReferenceURL : https://stackoverflow.com/questions/5900050/sqlite-table-disk-usage

반응형