2010-12-01 2 views
1

My Oracle 데이터베이스에는 간단하고 거의 변경되지 않은 데이터가 포함되어 있습니다 (변경하는 데 수개월 또는 수년이 걸림). 하지만 자주 액세스됩니다 (하루에 100 번). 나는 데이터베이스에 지속적으로 액세스하는 것이 비용이 많이 든다고 생각한다.변경된 데이터는 거의 저장되지 않지만 자주 액세스되는 경우가 있습니까?

EDIT :이 데이터를 데이터베이스에 저장하는 대신 다른 방법, 예를 들어 앱의 캐시에 저장하는 방법을 생각하고 있지만 데이터 일관성에 대해 혼란스러워합니다. 어떻게하면 효율적으로 할 수 있습니까?

편집 : 내 원래의 질문은 너무 일반적입니다. 나는 그것을 설명 할 명확 :

나는 포함하는 테이블이 있습니다 클라이언트가 우리의 서비스에 요청을 보낼

MinValue  MaxValue  PackageID 
1    4    1 
5    10   2 
11    50   3 

, 그것은 양을 보내드립니다, 그럼 우리의 서비스가 어떤 패키지이 결정해야 요청은에 속한다. 이는 금액에 따라 다르며 비즈니스 요구로 인해 변경 될 수 있습니다 (앞서 언급했듯이 거의 변경되지 않았습니다).

나는이 작업을 수행하는이 쿼리를 사용

select packageid from vmeet_temp where amount between minvalue and maxvalue 

예,이 작업을 수행합니다. 그러나 경험이 부족한 프로그래머이기 때문에 이것을 보관하는 것이 더 효율적인 방법인지는 의문입니다.

제 궁금한 점은 : 우리의 필요에 따라 데이터베이스에이 정보를 저장해야합니까, 아니라는 것입니까? 그렇지 않다면 어느 솔루션을 사용해야합니까?

+0

어떤 서버가 작성된다 : 다음 인용하여 자신을 familiarse 할 수 있습니다 미숙 한 프로그래머로서

? – hvgotcodes

+0

해당 테이블의 행 수는 얼마입니까? 백? 백만? –

+0

그것은 100에 도달하는 것 같지 않습니다 – Vimvq1987

답변

3

테이블에 저장하고 DBMS가 걱정하게하십시오. 캐싱 기능이있어 자주 사용하는 데이터가 메모리에 저장되므로 디스크로 이동하지 않아도됩니다. 정말로 원하면 응용 프로그램에 데이터를로드 할 수 있습니다. 데이터가 오래 걸릴 위험이 있습니다. 그러나 일반적으로 DBMS가 그것에 대해 염려하게하면 귀하에게 적합합니다.

테이블이 10 행에 불과하고 행 크기가 적당하지 않은 경우 (각각 최대 수백 바이트까지) DBMS는 인덱스를 생성하더라도 인덱스 사용에 별다른 어려움을 겪지 않을 것입니다. 테이블을 직접 사용하는 것이 더 간단하고 효율적입니다. 단순한 옵티 마이저조차도이를 관리합니다. 분명히, 잘못 배치 된 힌트가있는 인덱스를 사용하면 성능 저하를 겪게됩니다. 자체 장치에 남겨두면 옵티마이 저가 인덱스를 사용하지 않을 것입니다.

+0

로 작성되었습니다. 답변 해 주셔서 감사합니다.하지만 잘못 설명했다고 생각합니다. 데이터베이스에 대한 쿼리는 간단한 데이터에 비싸다고 생각합니다. 따라서이 데이터를 내 앱에서 캐시 할 생각입니다. 나 한테 제안 좀 해줄 수있어? – Vimvq1987

+0

@ Vimvq1987 : 값으로 무엇을 할 것인지, 얼마나 크게 할 것인지, 앱에서 어떻게 볼 것인지를 결정합니다. 귀하의 응용 프로그램에서 값을로드 (캐시) 할 수 있다고 말했습니다. 하지만 당신이 10 개의 값 중 어느 것이 더 처리하기 위해 전달되어야 하는지를 결정하기 위해 쿼리의 결과 행을 게시해야한다면, 앱에서 캐싱을 무시하는 것이 더 간단 할 수 있습니다. DBMS는 그 일을 처리합니다. 필요한 데이터를 반환합니다. OTOH, 오버 헤드를 측정하고 캐싱이 도움이된다면 캐싱을 사용하십시오. –

+0

+1 데이터베이스가 간단한 쿼리 캐싱에 적합합니다. – orangepips

1

작은 db 데이터로도 캐싱을 사용하는 것이 좋습니다. 이 유형의 시나리오 - 업데이트 된 데이터는 거의 없음 -을 의미합니다. 그것은 많은 경우에 DB에 갈 필요조차 없기 때문에 실제로 작업 속도를 높일 수 있습니다. 여기

앱이 느린 경우

http://msdn.microsoft.com/en-us/library/aa478965.aspx

, 당신은 ... 프로파일 러에 거기에 도착하고 병목 현상이 어디 있는지 알아 내야 .NET에서 캐싱을 설명하는 기사입니다

+0

나는 내 질문을 업데이 트했습니다, 나는 오라클을 사용하고 있습니다. 데이터는 매우 간단합니다. 약 10 행입니다. 인덱스가 필요하다고 생각하지 않습니다. – Vimvq1987

+0

@ vimvq1987, 서버가 작성한 내용은 무엇입니까? – hvgotcodes

+0

그것은 C# /. NET, – Vimvq1987

2

시작하려면 @Jonathan Leffler가 정확합니다. 데이터베이스가 제한된 데이터를 통해 간단한 쿼리를 캐싱하는 것이 좋습니다. 따라서 데이터베이스 서버가 높은 CPU 사용률이나 디스크 I/O와 같은 스트레스의 흔적을 보이지 않는다면 문제가 없을 것입니다. 그렇다면 오라클은 management views을 사용하여 어떤 쿼리가 가장 많은 처리 능력을 소비하는지 알려줍니다.

캐싱과 관련하여 하나의 서버 만 있고 기본 응용 프로그램을 통해 원본 테이블이 업데이트되는 경우 쓸모있는 전략을 사용할 수 있습니다. 다중 서버 설정의 경우 각 서버의 캐시를 새로 고치는 메시징이 필요합니다. 응용 프로그램을 통해 데이터가 업데이트되지 않으면 데이터가 변경 될 때를 확인하거나 알고 캐시를 새로 고치려면 쓰기 저장 전략이 필요합니다.

성능이 정말로 걱정된다면 JMeter와 같은 도구를 사용하여 병목 현상을 식별하는 대신 부하 테스트에 집중할 것을 제안합니다. 반복적으로 더 많은 스레드가 성능 메트릭을 기록 할 때마다 (일반적으로 페이지 응답 시간) Excel에 차트를 작성하십시오. 지수 라인이 보일 경우 병목 현상이 확인되었습니다. 일부 기능을 해제하고 코드에서 카운터를 추가하여 속도가 느려지는 부분을 확인하십시오. 당신이 물어 보는 데이터와 아무 관련이 없다는 것을 알 수 있습니다.

2
+0

방금 ​​더 자세한 내용을 추가했습니다. 그것을 확인하고 좀 더 구체적인 상황에서 나를 도와주세요. :) – Vimvq1987

0

작은 테이블을 치는 모든 쿼리 다른 데이터가 일반적인 시스템이 수행 액세스 상대적으로 비싼 될 가능성이다.

캐시를 통해이 쿼리를 최적화하는 데는 많은 노력이 필요합니다 (다른 답변과 같이).

조기 최적화 의 루트가 모든 악의

관련 문제