2011-12-09 5 views
0

데이터베이스 성능과 관련하여 일반적인 질문이 있습니다. DotNetNuke 비즈니스 로직을 사용하여 비즈니스 개체 및 SQL 2008 R2를 만듭니다. 웹 응용 프로그램 (asp.net/c#)입니다.많은 조인이있는 SQL 저장 프로 시저 간단한 저장 프로 시저에 대한 많은 데이터베이스 호출

다음과 같은 고려 :

내가 이름 같은 정보가 많이 포함 된 사용자 프로필을로드해야합니다, LASTNAME, XP, 동전, 원, 10 개 개의 서로 다른 테이블에서 필드 등 등를 많이, 잃었다.

하나의 데이터베이스 호출에서이 모든 정보를 얻기 위해 많은 조인 (및 중첩 된 select/count 문)이 포함 된 하나의 큰 저장 프로 시저를 만들었습니다.

제 질문은 이것이 올바른 접근 방법입니까? 아니면 간단한 저장 프로 시저에 많은 작은 데이터베이스 호출을 수행하는 것이 더 낫습니다.

제 아이디어는 특히 수십만 명의 사용자가있는 경우 하나의 데이터 베스 콜을 만드는 것이 더 좋습니다. 그러나 조인은 복잡해지기 시작하고 프로파일을로드하는 데 약간의 시간이 걸리기 시작합니다.

의견이 있으십니까? 아니면 아이디어?

+0

물론 나는 단일 쿼리가 대부분의 경우에 더 잘 수행 될 것이라는 가정을하고 있습니다. 물론 테이블이 적절히 인덱스되고 SQL 자체가 최적화되었다고 가정하면됩니다. – asawyer

답변

2

일반적으로 단일 저장 프로 시저가 여러 저장 프로 시저보다 페이지로드 시간이 빠르다는 것을 알 수 있습니다. 간단한 웹 응용 프로그램 내에서 사용되는 대부분의 저장 프로 시저의 경우 쿼리 실행 시간이 유선 시간보다 훨씬 짧습니다. 즉, 제 경험상 DB로 돌아가서 웹 서버로 돌아가는 행위는 쿼리를 실행하는 것보다 시간이 더 걸립니다.

그러나 여기 몇 가지 사항을 고려해야합니다.

  1. 모든 쿼리 실행마다 모든 테이블에 가입해야합니까? 또는 다른 테이블의 데이터 존재 여부에 따라 일부 조인 만 필요합니까? 일부 조인이 선택적이면 필요할 때만 호출되는 별도의 저장 프로 시저로 푸시하는 것이 좋습니다.

  2. 단일 저장 프로 시저가 더 빠를 수도 있지만 절차가 복잡해지면 시스템을 유지 관리하는 것이 더 어려워 질 수 있습니다. 이러한 복잡성으로 인해 데이터베이스 계층에서 애플리케이션 계층으로 넘어갈 수 있습니다. 데이터 결과 집합에서 Order 개체를 채우는 것을 고려하십시오. 쿼리 시간을 최적화하는 경우 여러 다른 저장 프로 시저에서 여러 가지 방식으로 주문 개체를 채우는 데 필요한 데이터를 가져 오는 것이 좋습니다. 그것은 객체 생성을 심각하게 복잡하게 만들 수 있습니다. 유지 보수 적으로 가치가있는 성능 향상이 있습니까?

  3. 추가 문제가있는 경우 항상 SQL 프로필을 실행하는 것이 가장 좋습니다. 하나의 복잡한 proc과 두 개의 작은 procs에 대해 CPU와 IO를 비교하고 대조 할 수 있습니다.

+0

인수 # 2에서 무엇을 의미하는지 명확하지 않습니다. 혼합되어 보입니다. – BornToCode

1

동시에 모든 데이터를 정말로 필요로한다면 SP에 가야합니다. 느린 경우 조정할 수 있습니다.

대부분의 시간과 그 중 일부만 필요로하는 경우 덜 복잡한 SP가 필요하지만 그 중 일부는 필요할 때만 호출됩니다.