문제

웹 서버와 SQL Server 2008 데이터베이스가 동일한 서버 팜의 다른 상자에 앉아있는 웹 응용 프로그램이 있습니다.

단일성 저장 프로 시저를 가져 와서 더 작은 저장된 procs로 끊어지면 클라이언트 코드가 하나의 대신 여러 개의 저장 프로 시저에 대한 호출을 책임지고 중요한 성능을 쳤습니다. 내 웹 응용 프로그램?


추가 배경 정보 :

Decision Logic, update 문을 포함하는 수백 줄의 코드가 포함 된 저장 프로 시저가 있으며 마지막으로 클라이언트에 대한 데이터 집합을 반환하는 SELECT 문입니다.

Client Code (이 의미에서 클라이언트 코드는 구성 요소 DLL을 호출하는 데이터베이스 서버를 호출하는 ASP 웹 서버 임)에 기능을 삽입해야합니다. 그러나 저장 프로 시저는 레코드 세트를 업데이트하고 동일한 호출에서 UDPated 데이터를 반환하는 것으로, 의사 결정 논리 및 업데이트 명령문이 호출되지만 이후의 코드를 이상적으로 요구해야합니다. / EM> 데이터가 클라이언트에 반환됩니다.

이 기능을 작동 시키려면 기존 저장된 proc을 적어도 두 부분으로 나누어야 할 것입니다. 데이터베이스에서 데이터를 검색하는 다른 데이터베이스와 다른 데이터베이스를 업데이트하는 하나의 저장된 proc입니다. 그런 다음 저장된 proc 호출 사이에 새 코드를 삽입합니다.

이 문제를 볼 때, 나는 코드 유지 보수 지점에서 을 분리하는 것이 훨씬 낫다고 생각할 수는 없습니다. 저장된 procs 및 비즈니스 논리를 클라이언트 코드에 맡깁니다. 이렇게하면 기능이나 의사 결정 논리를 내 클라이언트 코드에 삽입해야 할 때마다 거대한 저장된 proc을 수정하는 대신 클라이언트 코드를 변경하는 것입니다.

씬 저장된 procs를 사용하는 것은 코드 유지 보수 지점에서 볼 수 있지만 데이터베이스에 대한 여행 수를 늘려서 성능 고통을 얼마나 경험하게 될 것인가? 데이터에 대한 순 결과는 동일하지만 데이터베이스를 더 자주 만지고 있습니다. 이 접근법은 응용 프로그램이 수요를 처리하도록 확장 될 때 성능에 어떻게 영향을 미칩니 까?

저는 특히 코드 유지 보수에 영향을 미치는 영향을 미치는 모든 것이 아니라 다른 모든 것보다 높은 성능 최적화를 배치하는 것이 아닙니다. 웹 응용 프로그램이 확장 할 때 두통을 촬영하고 두통을 만드는 것이 좋습니다.

도움이 되었습니까?

해결책

일반적으로 엄지 손가락의 원칙적으로 최소한 SQL Server로 왕복을 수행해야합니다.

서버의 "히트"는 매우 비쌉니다. 실제로 동일한 작업을 3 개의 부분에 덮은 다음 서버에서 다른 모든 것을 수행하는 데 더 비쌉니다.

유지 보수와 관련하여 클라이언트에서 저장된 proc를 호출하여 proc가 다른 2 proc의 proc을 호출 할 수 있습니다.

나는 극단적 인 검색 논리가있는 응용 프로그램을 가졌습니다.

일부 벤치마킹 결과 ... 나는 서버가 떨어지고 무너지는 동안 클라이언트 A가있었습니다. 문제를 확인하면 SQL Server에 대한 많은 왕복은 최소화 할 때 서버가 다시 정상으로 돌아 왔습니다.

다른 팁

그것은 그것에 영향을 미칩니다.우리는 모든 비즈니스 로직이 AppServer에 DB / 2 데이터베이스에 연결된 WebLogic 서버를 사용합니다.우리는 주로 우리 프로젝트에서 엔티티 콩을 사용하며 대부분의 비즈니스 서비스 호출은 보이는 부작용이없는 DB에 대해 여러 번 여행합니다.(일부 쿼리는 필요할 때 멀티 테이블로 조정합니다.)

그것은 실제로 앱에 의존합니다.당신은 벤치 마크해야합니다.

좋은 하드웨어에 대한 잘 설정 SQL Server는 초당 수천 개의 트랜잭션을 처리 할 수 있습니다.

실제로 큰 저장 프로 시저를 분리하면 일괄 처리 당 하나의 캐시 된 쿼리 계획 만 가질 수 있기 때문에 유용 할 수 있습니다.여러 배치를 끊는 것은 각각 자신의 쿼리 계획을 얻을 것이라는 의미입니다.

코드 유지 보수 측면에서 확실히 오류가 있지만 벤치 마크는 확실합니다.

쿼리 계획 가로가 칠지가 있음을 감안할 때 인덱스를 업데이트 할 준비가되어 있어야합니다.

본질적 으로이 질문은 느슨한 커플 링과 긴밀한 대단한 결합과 밀접한 관련이 있습니다.

아웃 세트 : 항상 모 놀리 식 저장 프로 시저를 가져 와서 하나의 저장 프로 시저 에 의해 모두 호출되는 로 분해하여 클라이언트 코드 만 호출 할 책임이 있습니다하나의 저장 프로 시저.

클라이언트가 무언가를 수행하지 않는 한 (데이터를 변경하거나 사용자에게 상태를 제공하십시오) 클라이언트를 클라이언트를보다 단단히 결합 할 수 없으므로 클라이언트를 저장 프로 시저에 대한 작업 순서로 더 단단히 결합 할 것이기 때문입니다.상당한 성능이 증가합니다.

어느 쪽이든, 나는 그것을 벤치 마크하고 거기에서 조정할 것입니다.

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