2009-08-06 2 views
3

백업 작업에 대한 정보를 저장하는 데 sqlite 데이터베이스가 있습니다. 각 실행마다 특정 테이블에 약 32,000 개의 항목을 추가하면 약 25MB가 증가합니다.SQLite의 성능에 대한 주요한 영향

이 테이블은 특정 정보를 다른 테이블의 레코드에 연결하는 데 사용되는 "맵 테이블"이며 사용하지 않는 기본 키 (autoincrement int)를 가지고 있습니다.

sqlite는 값에 따라 INT 열에 대해 1, 2, 4 또는 8 바이트를 예약합니다. 이 테이블에는 INT 유형의 3 개의 추가 열만 있습니다.

필자는 쿼리에서 필터로 사용하는 열의 인덱스를 데이터베이스에 추가했습니다.

인덱스가있는 상황에서 설명 된 상황에서 기본 키는 성능 측면에서 어떤 유용한 이점을 갖고 있습니까?

참고 : 성능은이 프로젝트에서 매우 중요하지만 32,000 개의 입력 작업에 10ms를 저장하면 추가로 10MB의 데이터가 필요하지 않습니다!

답변

2

기본 키 인덱스는 주어진 기본 키에 대한 행을 검색하는 데 사용됩니다. 또한 기본 키 값이 고유한지 확인하는 데 사용됩니다.

다른 열을 사용하여 데이터를 검색하면 기본 키 인덱스가 사용되지 않으므로 성능상의 이점이 없습니다. 그것의 단순한 존재는 부정적인 성능에 영향을 끼쳐서는 안된다.

불필요한 인덱스는 디스크 공간을 낭비하고 INSERT 및 UPDATE 문을 더 느리게 실행합니다. 쿼리 성능에 부정적인 영향을주지 않아야합니다.

+0

나는 이것에 대부분 동의합니다. 중요한 아이디어는 데이터베이스를 메모리에 보관하는 것입니다. 인덱스가 너무 크면 문제가 될 수 있습니다. – Unknown

+0

@Unknown : 일반적인 디스크 기반 메모리 캐싱 데이터베이스의 경우 사용되지 않는 인덱스는 메모리에 들어가서는 안되며 사용하면 사용하지 않는 인덱스는 곧 다시 제거됩니다. 그러나 예, 백업 디스크 스토리지가없는 완전한 메모리 내장 데이터베이스를 구축하는 경우 이러한 인덱스가 문제를 일으킬 수 있습니다. – Thilo

0

이 ID를 실제로 사용하지 않으면이 열 + 기본 키를 삭제하지 마십시오. 사용되지 않은 기본 키 id 열을 활성 상태로 유지하는 유일한 이유는 다른 테이블과 마스터 - 세부 관계를 만들 수있게하는 것입니다.

또 다른 가능성은 열을 유지하면서 기본 키를 삭제하는 것입니다. 이는 응용 프로그램이 모든 삽입 문에 고유 한 ID를 제공해야한다는 것을 의미합니다. 각 배치 작업 전후에이 열이 여전히 고유한지 여부를 확인해야합니다. 멀티 동시성 문제로 인해 MySQL과 Oracle에서는 작동하지 않지만 sqlite에서는 작동합니다.