2012-03-01 2 views
0

데이터베이스에서 정보를 가져 오기 위해 저장 프로 시저를 사용하고 있습니다. 먼저 모든 부모 요소를 가져 와서 배열에 보관 한 다음 부모 ID를 사용하여 관련된 모든 자식을 가져옵니다. 각 부모는 150 명의 자녀를 가질 수 있습니다. 약 100 개의 상위 요소가 있습니다. 가져 오기 작업의 성능을 향상시키는 가장 좋은 방법은 무엇입니까? 현재 검색하는 데 13 초가 걸립니다.데이터베이스 가져 오기 작업의 성능 향상

while(reader.read()) 
{ 
    Parent p = new Parent(); 
    // assign properties to the parent 

    p.Children = GetChildrenByParentId(parent.Id);  
} 
+1

합니까 GetChildrenByParentId()가 다른 저장된 프로 시저를 다른 연결을 생성하고 전화를? – Jason

+0

예 별도의 연결을 만들고 별도의 저장 프로 시저를 호출합니다. – azamsharp

+0

사용중인 SQL Server의 버전은 무엇입니까? – Jason

답변

4

당신은 하나의 SQL 선택/proc 디렉토리에 저장되어있는 모든 데이터를 얻어야한다 부모와 자녀 객체를 채울 다음과 (하위 데이터에 가입 일종의을) :

다음은 기본적인 알고리즘이다. 이제 DB에 100 * 150 = 15000 요청을했습니다. 한 번의 요청으로이 작업을 수행 할 수 있다면 극적인 성능 효과를 기대할 수 있습니다.

https://www.simple-talk.com/sql/t-sql-programming/rbar--row-by-agonizing-row/

+0

을 사용하고 있습니다. 시도해 볼 수 있습니다! 감사합니다 – azamsharp

+1

+1 안토니오. 이것은 RBAR (google it)으로 알려져 있습니다. 관계형 데이터베이스는 세트를 검색하도록 설계되었습니다. 이 코드는 은행에 가서 1 회 거래로 1,000 달러를 인출하는 대신 1000 번 (1,000 회!)의 현금을 인출하는 것과 비교할 수 있습니다. – brian

1

첫 번째이자 가장 중요한 단계는을 측정하는 것입니다 : 여기에이 achronime처럼 RBAR, RowByAgonizingRow : 로 많이 알려져있다

브라이언 코멘트에서 언급 한 바와 같이, 더 공연. 병 목인 SQL Server 또는 .NET입니까?

또한 데이터베이스로 돌아 가야하는 시간을 최소화해야하므로 단일 저장 프로 시저에서 필요한 모든 데이터를 검색 할 수 있다면 가장 좋을 것입니다.

귀하의 질문에, 그것은 저에게 SQL 서버처럼 문제가 있다고 들립니다. 이를 테스트하려면 SQL 쿼리 분석기에서 저장 프로 시저를 실행하고 알려진 상위 ID에 걸리는 시간을 확인하십시오. SQL이 데이터를 더 빠르게 얻을 수 있도록 기본 테이블에 인덱스를 추가하기 만하면됩니다. 가능하면 저장 프로 시저의 실행 계획을보십시오. 실행 계획 읽기에 대한 좋은 기사를 찾으실 수 있습니다 here.

1

SQL Server 2008은 사용자 정의 테이블 형식을 만들고 부모 ID 목록을 전달하거나 처음에 부모 ID를 얻고 테이블에 조인하는 데 사용한 논리를 사용할 수 있습니다 자식 데이터를 보유합니다.

CREATE TYPE [dbo].[Int32List] 
AS TABLE (
[ID] int NOT NULL 
); 
GO 

그리고 당신의 저장된 프로 시저가이 같은 간다 :

는 이런 일을하기 위해선, 테이블 유형을 만들려면

CREATE PROCEDURE [dbo].[MyStoredProc] 
@ParentIDTable [dbo].[Int32List] READONLY 
AS 
--logic goes here 
GO 

을 그리고 당신은이처럼 C# 코드에서 해당 프로 시저를 호출 :

DataTable ParentIDs = new DataTable(); 
ParentIDs.Columns.Add("ID", typeof(int)); 

SqlConnection connection = new SqlConnection(yourConnectionInfo); 
SqlCommand command = new SqlCommand("MyStoredProc", connection); 
command.CommandType = CommandType.StoredProcedure; 
command.Parameters.Add("@ParentIDTable", SqlDbType.Structured).Value = ParentIDs; 
command.Parameters["@ParentIDTable"].TypeName = "Int32List"; 

이 방법은 효과적으로 v SQL Server에 알림을 보내 테이블처럼 취급합니다. 저장 프로 시저에 값 배열을 전달하려는 모든 응용 프로그램에서 테이블 형식을 사용합니다. C# DataTable의 열 이름은 사용자가 만든 테이블 형식의 열 이름과 일치해야하며 TypeName 속성은 테이블 형식의 이름과 일치해야합니다.

이 방법을 사용하면 DB를 한 번만 호출하고 결과를 반복 할 때 선택 목록에 ParentID를 포함시켜 각 자식을 적절한 부모 개체와 비교할 수 있도록해야합니다 .

여기에 더 자세히 테이블 유형을 설명 할 수있는 좋은 자원이다 : http://www.sommarskog.se/arrays-in-sql-2008.html