2012-12-12 7 views
7

Java + JPA/Hibernate + Mysql에 대한 구체적인 케이스를 요구하고 있지만이 질문을 많은 언어에 적용 할 수 있다고 생각합니다.쿼리 또는 코드를 사용하는 경우

때로는 직원과 같은 엔티티를 얻기 위해 데이터베이스에 대한 쿼리를 수행해야합니다. 특정 직원 ('죤'을 이름으로 사용하는 직원)이 필요하다고 가정하면 정확한 직원 세트를 반환하는 쿼리를 수행 하시겠습니까, 아니면 모든 직원을 검색 한 다음 프로그래밍 언어를 사용하여 검색하는 것이 좋습니까? 당신이 관심있어하는 것들? (용이성, 효율성)? (일반적으로) 어느 것이 더 효율적입니까?

테이블 크기에 따라 다른 접근 방식보다 나은 접근 방식이 있습니까?

고려 :

  • 같은 복잡성, 두 경우 모두 재사용은.
+4

더 좋은 점은 많은 음식을 집에 저장하거나 조금씩 사다는 것입니다. 너 많이 여행 할 때? 파티를 열 때? 그것은 달려있다, 그렇지? 마찬가지로 최상의 접근 방식은 성능 최적화 문제입니다. 그것은 많은 변수를 포함합니다.이 기술은 솔루션을 설계 할 때 자신을 페인팅하지 못하도록 막고 실제 병목 현상을 알았을 때 나중에 최적화합니다. 좋은 출발점은 다음과 같습니다. http://en.wikipedia.org/wiki/Performance_tuning 어느 정도 보편적으로 도움이 될 수 있다고 생각하는 분, 데이터 액세스를 잘 캡슐화하십시오. –

+0

당신의 대답은 정말로 당신이 가장 많이 배울 수있는 대답이라고 말하고 싶습니다! – dgmora

+0

@ dgarcia, 감사합니다. 나는 당신이 받아들이기를 원한다면 대답으로 승진시키고있다. –

답변

4

자주 프로그래밍에서 사용되는 - 빠른 속도로 작동하는 메모리를 사용합니다. 직원 수가 많고 중요한 부분을 쿼리 할 때 하나씩 (예 : 75 %가 한 번에 쿼리되거나 다른 쿼리로 쿼리 됨) 모든 쿼리를 수행합니다. 캐시 (매우 중요합니다!), 메모리에서 검색을 완료하십시오. 다음에 쿼리 할 때 RDBMS 여행을 건너 뛰고 곧바로 캐시로 가서 빠른 검색을하십시오. 데이터베이스에 대한 왕복은 인 메모리 해시 조회에 비해 매우 비쌉니다.

반면 직원의 소수만 액세스하는 경우 직원 한 명만 쿼리해야합니다. RDBMS에서 프로그램으로의 데이터 전송에는 많은 시간이 걸리고 많은 네트워크 대역폭과 많은 메모리가 필요합니다 그리고 RDBMS 측에서 많은 메모리를 필요로합니다. 행을 많이 질의하여 하나를 제외한 모든 것을 버리는 것은 결코 의미가 없습니다.

10

항상 데이터베이스에서 쿼리를 수행하십시오. 그렇지 않으면 클라이언트에 더 많은 데이터를 복사해야하며 데이터를 효율적으로 필터링하기 위해 데이터베이스가 코드보다 효율적입니다.

내가 생각할 수있는 유일한 예외는 필터 조건이 계산 상 복잡하고 데이터베이스가 가진 것보다 더 많은 CPU 성능으로 계산을 분산시킬 수 있다는 것입니다.

데이터베이스가있는 경우 서버가 클라이언트보다 많은 CPU 성능을 가지고 있기 때문에 오버로드하지 않으면 동일한 양의 코드에 대해 쿼리가 더 빨리 실행됩니다.

또한 클라이언트에서 데이터를 조작하기위한 코드를 작성하는 대신 Hibernate 쿼리 언어를 사용하여 데이터베이스에서 쿼리를 수행하는 코드를 적게 작성해야합니다. 또한 Hibernate 질의는 더 많은 코드를 작성할 필요없이 설정에서 클라이언트 캐싱을 사용한다.

2

상황에 따라 다릅니다. 일반적으로 SQL을 사용하여 정확한 결과 집합을 얻는 것이 좋습니다.

모든 엔티티를로드하고 프로그래밍 방식으로 검색 할 때 발생하는 문제는 많은 메모리가 필요할 수있는 모든 엔티티를로드해야한다는 것입니다. 또한 모든 엔티티를 검색해야합니다. RDBMS를 활용하여 원하는 결과를 얻을 수있을 때 왜 그렇게합니까? 즉, RDBMS에서 작업 할 수있을 때 너무 많은 메모리를 사용할 수있는 대형 데이터 세트를로드 한 다음 처리해야하는 이유는 무엇입니까?

데이터 세트의 크기가 너무 크지 않다면 메모리에로드 한 다음 쿼리 할 수 ​​있습니다.이 경우 RDBMS로 이동할 필요가 없습니다. 시스템 아키텍처에 따라 네트워크를 거칠 수도 있고 가지지 않을 수도 있습니다.

그러나 그렇다고하더라도 다양한 캐시 유틸리티를 사용하여 일반적인 쿼리 결과를 캐싱 할 수 있으므로 데이터를 직접 캐싱하는 이점이 사라집니다.

4

일반적으로 나는 데이터베이스가 좋은 데이터베이스를하도록 내버려 둘 것입니다. 데이터 필터링은 데이터베이스가 실제로 잘 작동하는 곳이기 때문에 최선의 결과를 얻을 수 있습니다.

그렇긴하지만, 모든 상황을 파악하고 코드에서 필터링을 수행하려는 경우가 있습니다. 행 수가 상대적으로 적고 앱에 캐시 할 계획이라면 생각할 수 있습니다.이 경우 모든 행을 찾아 캐시하고 캐시에있는 것에 대해 후속 필터링을 수행하면됩니다.

2

접근 방식은 시간이 지남에 따라 확장되어야 함을 기억하십시오. 작은 데이터 세트가 나중에 시간이 지남에 따라 거대한 데이터 세트로 바뀔 수 있습니다. 프로그래머가 전체 테이블을 쿼리 한 다음 조작을 수행하도록 응용 프로그램을 코딩 한 문제가있었습니다. 이 접근법은 두 개의 subselect가있는 행이 100 개 밖에 없었지만 잘 작동했지만 데이터가 커지면서 성능 문제가 분명하게 나타났습니다. 지난 365 일 동안 만 조회 할 수있는 날짜 필터를 삽입하면 애플리케이션의 확장에 도움이됩니다.

1

- 당신은 최대 절전 모드로 특정 대답을 찾고 있다면,을 조회하는 방법을 사용하는 것이 좋습니다 시간이 지남에 따라 확장 할 수있는 직원 수를 -assuming 직원의 예를 감안할 때 마크의 대답

@ 확인 정확한 데이터를위한 데이터베이스. 그러나 데이터가 빠르게 커질 가능성이 적은 부서 (예 : Department)와 같은 것을 고려하고 있다면 쿼리를 모두 수행하고 메모리에 저장하는 것이 유용합니다. 매번 외부 리소스 (데이터베이스)가 발생하여 비용이 많이 듭니다.

그래서 일반 매개 변수 사용의

  • 주파수는
  • 어떤 의미를 넣어

  • 중요도 데이터의 bussiness
  • 볼륨에 데이터

    1. 스케일링이있는 때 데이터는 자주 확장되지 않으며 데이터는 업무상 중요하지 않으며 데이터 볼륨은 메모리에서 관리 할 수 ​​있습니다. pplication server와 자주 사용됩니다 - 필요하다면 모든 것을 가져 와서 프로그램으로 필터링하십시오.

      그렇지 않으면 특정 데이터 만 가져옵니다.

  • 1

    더 좋은 점은 많은 음식을 집에 저장하거나 조금씩 사기 위해서입니다. 너 많이 여행 할 때? 파티를 열 때? 그것은 달려있다, 그렇지? 마찬가지로 최상의 접근 방식은 성능 최적화 문제입니다. 그것은 많은 변수를 포함합니다. 이 기술은 솔루션을 설계 할 때 자신을 페인팅하지 못하도록 막고 실제 병목 현상을 알았을 때 나중에 최적화합니다. 좋은 시작점은 다음과 같습니다. en.wikipedia.org/wiki/Performance_tuning 어느 정도 보편적으로 도움이 될 수 있습니다. 데이터 액세스를 잘 캡슐화하십시오.

    +0

    나는 그것이 아주 유용하다고 생각할지라도 '대답하는'것이 주 주제 인 것은 아니기 때문에 대답으로 선택하지 않았다. – dgmora

    관련 문제