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
'programing' 카테고리의 다른 글
MySQL에서 인덱스를 생성하거나 삭제하기 위해 "존재하는 경우"를 어떻게 사용할 수 있습니까? (0) | 2021.01.14 |
---|---|
동일한 테이블에있는 다른 행의 데이터로 행 업데이트 (0) | 2021.01.14 |
PowerMock 및 Mockito로 Logger 및 LoggerFactory 모의 (0) | 2021.01.14 |
JSlint에서보고 한 "foo is not defined"오류를 수정하는 방법은 무엇입니까? (0) | 2021.01.14 |
구문 오류 : JavaScript의 잘못된 반환 문 (0) | 2021.01.14 |