문제

종종 나는 구성 요소 또는 어린이 회원에서 파생 된 속성이있는 집계 또는 부모 엔티티를 다룹니다. 예를 들어:

  • 그만큼 byte_count 그리고 packet_count a TcpConnection 객체는 두 구성 요소의 동일한 속성에서 계산됩니다. TcpStream 결과적으로 구성 요소에서 계산됩니다. TcpPacket 사물.

  • an Invoices 객체가있을 수 있습니다 total 기본적으로 구성 요소의 합계 InvoiceLineItems'약간의화물, 할인 및 세금 논리가있는 가격.

수백만의 패킷 또는 수백만 개의 인보이스 라인 항목을 다룰 때 (원!), 보고서 나 웹 인터페이스와 같은 프레젠테이션 로직에서 볼 때 이러한 파생 된 속성의 주문형 계산은 종종 용납 할 수 없을 정도로 느립니다.

성능이 우려되기 전에 손을 강제하기 전에 미리 계산 된 필드에 파생 된 속성을 "홍보"할지 여부를 어떻게 결정합니까?

도움이 되었습니까?

해결책

나는 개인적으로 성능 상충이 내 손을 강제 할 때까지 (탈피의 단점이 너무 과감한 IMHO이기 때문에) 다음을 고려할 수도 있습니다.

  1. 편의: 예 : 두 개의 다른 클라이언트 앱이 동일한 파생 된 속성을 계산하려면 둘 다 쿼리를 코딩하여 계산해야합니다. denormalization은 두 클라이언트 앱에 파생 된 속성을 더 간단하게 제공합니다.
  2. 시간이 지남에 따라 안정성: 예 : 파생 속성을 계산하기위한 공식이 변하면, 탈피율화가 한 시점에 파생 된 값을 캡처하고 저장할 수 있으므로 향후 계산이 잘못되지 않을 것입니다.
  3. 더 간단한 쿼리: DB 구조에 복잡성을 추가하면 클라이언트 엔드에서 선택 쿼리가 더 간단하다는 것을 의미 할 수 있습니다.
  4. 성능: delormalized 데이터에서 쿼리를 선택하는 것이 더 빠를 수 있습니다.

ref : 데이터베이스 프로그래머 : 비정규 화에 대한 주장. 그의 기사를 읽어보십시오 비정규 값을 올바르게 유지합니다 - 그의 추천은 트리거를 사용하는 것입니다. 이로 인해 트레이드 오프 탈퇴가 필요로하는 종류를 집으로 가져옵니다.

다른 팁

기본적으로, 당신은 그렇지 않습니다. 당신은 성능 문제를 남겼습니다.

그것은 99%의 시간이기 때문에 최고의 대답입니다. ~ 아니다 이와 같이 사전 최적화하는 것이 좋습니다. 즉시 계산하는 것이 좋습니다.

그러나 클라이언트 응용 프로그램 개발자가 잘못된 선입견을 가지고 서버 측에 오는 것이 일반적입니다.파생 된 속성의 주문형 계산 ...- IS 자주 용납 할 수 없을 정도로 느립니다", 이것은 사실이 아닙니다. 여기의 올바른 문구는"~이다 드물게 용납 할 수 없을 정도로 느립니다".

따라서이 (DB 개발 아키텍트 등) 전문가가 아니라면 조기 최적화에 참여해서는 안됩니다. 그것이 될 때까지 기다리십시오 분명한 고정되어야합니다. 그 다음에 사전 응집을보십시오.

데이터의 최신 데이터는 실제로 구현 방법을 결정해야합니다.

나는 2 개의 간단한 상태를 가정 할 것입니다 : 현재 또는 현재.

  • 현재 : 집계 테이블 등을 유지하기 위해 인덱스 뷰, 트리거, 저장 Procs
  • 현재가 아닌 : 서비스 스냅 샷보고, 로그 배송/복제, 데이터웨어 하우스 등

즉, Prod에서와 동일한 양의 데이터에 대해 발전 할 것이므로 응답 시간에 대한 확신이 있습니다. 코드 성능에 거의 놀라지 않아야합니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top