2008-10-28 4 views
0

우리는 심각하게 제한되어 있기 때문에 최소한의 메인 메모리를 사용하는 데이터베이스 관리 시스템 (DBMS)을 선택해야합니다. DBMS는 주 메모리에 색인을 보관하기 위해 점점 더 많은 메모리를 사용할 것이므로, 어느 DBMS가 가장 작은 메모리 풋 프린트를 가지고 있는지 정확히 어떻게 알 수 있습니까?앱이 사용하는 메인 메모리의 양을 알려주는 방법

바로 지금 우리는 X라고 부르는 일련의 쿼리를 수행하는 동안 열린 메모리 모니터 프로그램을 가지고 있습니다. 그런 다음 다른 DBMS에서 같은 쿼리 집합 X를 실행하고 수명이 얼마나되는지 확인하십시오 다른 메모리 사용 공간과 비교할 수 있습니다.

이것에 대해 멍청한 방법일까요? 더 좋은 방법이 있습니까?

감사합니다, Jbu 궁극적으로 이런 종류의 최적화가 잘못되었을 가능성이 질문에 대답한다

+0

왜 제약이 있습니까? 기억이 싸다! 모바일/임베디드 기기 용입니까? –

답변

0

.

DBMS가 테스트 중에보다 "실제"환경에서 다르게 반응하기 때문에 이러한 유형의 테스트를 통해 수집 한 답변은 오해의 소지가 있습니다. 더군다나, 당신은 특정 아키텍처에 자신을 묶고 있습니다. 일단 코드를 작성하면 DBMS를 변경하는 것이 어렵습니다. DBMS가 사용자의 필요를 채우고 개발 프로세스를 간소화하고 SQL 쿼리와 인덱스를 응용 프로그램의 요구 사항에 맞게 최적화하고 있는지 확인하는 것이 훨씬 낫습니다.

+0

다행히 데이터베이스를 사용하는 자바 애플리케이션의 표준 API 인 JDBC를 사용하고 있습니다. –

+0

JDBC는 SQL 문을 통해 전달하는 "파이프"입니다 ... 불행히도 데이터베이스 간의 SQL 구문은 종종 다릅니다. –

1

응용 프로그램에서 수행 할 수있는 작업은 데이터를 가져 오는 방법을 관리하는 것입니다. 주어진 쿼리에서 모든 행을 가져 오는 경우 애플리케이션에 Collection을 빌드하려고 시도 할 수 있습니다.주의하지 않으면 메모리를 매우 빨리 소모 할 수 있습니다. 이것은 아마도 메모리 소모의 가장 큰 원인 일 것입니다.

이 문제를 해결하려면 쿼리에 커서를 놓고 결과 집합을 반복하면서 행 개체를 하나씩 버리고 하나씩 가져옵니다. 그렇게하면 한 번에 한 행만 저장되므로 "최고점"을 더 쉽게 예측할 수 있습니다.

JDBC 드라이버 (연결하려는 데이터베이스 브랜드)에 따라 JDBC 드라이버 이 아니라이 fetchall을 수행하도록하는 것이 까다로울 수 있습니다. 예를 들어, 일부 드라이버는 전체 결과 집합을 가져 와서 뒤로 스크롤하거나 전달할 수 있습니다. JDBC가 표준 인터페이스이지만 fetchall 대신 row-at-a-time을 수행하도록 구성하면 독점 옵션이 포함될 수 있습니다.

데이터베이스 서버 측에서는 인덱스 캐시에 할당하는 메모리 양을 관리 할 수 ​​있어야하지만 구성 할 수있는 특정 항목은 데이터베이스의 각 브랜드마다 다릅니다. 각 서버를 조정하는 방법을 배우는 지름길은 없습니다.

2

그냥 SQLite를 사용하십시오. 단일 프로세스에서. C++의 경우 선호합니다.

관련 문제