프로그래밍 관련/DB SQL

SQLite - 파일 용량 관련(관리,줄이기)(auto_vacuum)

AlrepondTech 2011. 6. 21. 15:39
반응형

 

 

 

=================================

=================================

=================================

 

 

 


출처: http://202psj.tistory.com/

파이어폭스 플러그인에 sqlmanger 를 설치후
파이어폭스-> 도구 -> sqlite manger 실행

데이타베이스 connect  후 위에 메뉴에 Datebase -> Compect Database

메뉴이름대로 있는 데이터대로 용량이 된다.

 

 

=================================

=================================

=================================

 



//auto_vacuum 관련해서 이야기가 많으니 잘 찾아보고 상황판단뒤 사용해보도록 하자 (auto_vacuum ,속도.효율성 관련해서 문제가 있을수도 있다.)

 
TABLE을 생성하기전에 아래 구문을 추가한다.
PRAGMA auto_vacuum = 1;

그렇지 않으면, DELETE FROM TABLE을 이용해서 모든 내용을 비워도, DB파일의 크기가 줄어들지 않을 것이다.

TABLE 생성이후에는 방법이 없다. DROP 시키고, 새로 TABLE을 만들어야 하고, 그 전에 저 구문을 적용해야 한다.

References
http://www.sqlite.org/pragma.html#pragma_auto_vacuum

[출처] SQLite 파일 용량 줄이기|작성자 세직사

 

 

=================================

=================================

=================================

 


출처: http://cybershin.x-y.net/wiki/index.php/Vacuum_example

auto_vacuum pragma를 사용하면 현재의 Auto Vacuum 모드를 확인하거나 세팅할 수 있습니다. 아래와 같이 인자를 설정하지 않으면 현재 모드를 확인할 수 있습니다.

PRAGMA auto_vacuum;

또한 다음과 같이 Auto Vacuum 모드를 설정할 수 있습니다.

PRAGMA auto_vacuum = 0 | NONE | 1 | FULL | 2 | INCREMENTAL;

빌드옵션을 주지 않은 이상, Auto Vacuum 모드는 꺼져 있는 것이 기본입니다( 0 | NONE ). 이 상태에서는, 데이터베이스에 delete를 하더라도 데이터 파일의 용량이 줄어들지 않습니다. 즉, 강제로 "VACUUM" 구문을 실행하지 않는 다면 데이터 사이즈는 그대로입니다. auto_vacuum을 1이나 FULL로 설정하면, commit 될 때 마다 빈 페이지들을 데이터베이스 파일의 끝부분으로 이동시키고 잘라내게 됩니다. auto_vacuum을 2나 incremental로 설정하면, 따로 incremental_vaccum pragma를 쓰지 않는 이상, 파일을 잘라내지 않습니다. 이 모드는 FULL auto_vacuum 모드일 때의 단편화(fragmentation) 현상을 해결하기 위한 실험적인 모드입니다.

간단한 테스트로 얼마나 효과가 있는지 테스트해 보도록 하겠습니다. 0에서 999까지 정수를 테이블에 입력하는데, no_vacuum.db 파일에는 auto_vacuum 모드를 꺼 놓고 입력하고, vacuum.db 파일에는 auto_vacuum 모드를 켜 놓고 입력해 보도록 하겠습니다.

int capi_example_temp() { 	sqlite3 *db; 	char sql[255]; 	int i;  	// auto_vacuum = 0 	sqlite3_open("no_vacuum.db", &db); 	sqlite3_exec(db,  		"PRAGMA auto_vacuum=0;" // auto_vacuum을 OFF. 		"CREATE TABLE IF NOT EXISTS tblTest(id int);",  		NULL, NULL, NULL);  	for(i=0;i<1000;i++){ 		sprintf(sql, "INSERT INTO tblTest(id) VALUES (%d);", i); 		sqlite3_exec(db, sql, NULL, NULL, NULL); 	}  	sqlite3_exec(db, "DELETE FROM tblTest WHERE id>=0;", NULL, NULL, NULL); 	sqlite3_close(db);  	// auto_vacuum = 1 	sqlite3_open("vacuum.db", &db); 	sqlite3_exec(db,  		"PRAGMA auto_vacuum=1;" // auto_vacuum을 ON. 		"CREATE TABLE IF NOT EXISTS tblTest(id int);", 		NULL, NULL, NULL);  	for(i=0;i<1000;i++){ 		sprintf(sql, "INSERT INTO tblTest(id) VALUES (%d);", i); 		sqlite3_exec(db, sql, NULL, NULL, NULL); 	}  	sqlite3_exec(db, "DELETE FROM tblTest WHERE id>=0;", NULL, NULL, NULL); 	sqlite3_close(db);  	return 0; } 
no_vacuum.db, 13KB vacuum.db, 3KB 

파일 사이즈가 엄청나게 차이나는 것이 보이시죠? 파일 사이즈 이외에도 유의하셔야 할 점이 있는데 rowid의 변경입니다. 아래의 SQL구문을 보시면 VACUUM을 하게 될 경우 rowid도 변경되는 것을 보실 수 있습니다. 즉, rowid를 참조할 경우에는 조심하셔야 합니다.

sqlite> CREATE TABLE tblTest(id INTEGER, fruit TEXT); sqlite> sqlite> INSERT INTO tblTest(id, fruit) VALUES(10, 'apple'); sqlite> INSERT INTO tblTest(id, fruit) VALUES(20, 'banana'); sqlite> INSERT INTO tblTest(id, fruit) VALUES(30, 'orange'); sqlite> INSERT INTO tblTest(id, fruit) VALUES(40, 'tomato'); sqlite> sqlite> SELECT rowid, id, fruit FROM tblTest; rowid       id          fruit ----------  ----------  ---------- 1           10          apple 2           20          banana 3           30          orange 4           40          tomato sqlite> DELETE FROM tblTest WHERE id in (20, 30); sqlite> VACUUM; sqlite> SELECT rowid, id, fruit FROM tblTest; -- rowid를 새로 만듬 rowid       id          fruit ----------  ----------  ---------- 1           10          apple 2           40          tomato 

또한, VACUUM은 Attach 된 데이터베이스에는 영향을 미치지 않습니다.

 

 

=================================

=================================

=================================

 

 

 

 

반응형