2017-09-06 15 views
-1

SQL 데이터베이스 (약 200k 레코드, 7 개 열)에서 비교적 많은 양의 데이터를 가져 와서 다른 테이블에 업데이트/삽입해야하는 코드가 있습니다.SqlDataReader를 사용하여 큰 데이터 세트로 작업하기

초기 반복 작업은 SqlDataReader를 열고 반복하여 수행합니다. 데이터베이스에서 열린 트랜잭션을 보유하고있는 것처럼 보이지만 프로세스가 실행될 때까지 몇 시간 동안 잠금 문제가 발생할 수 있습니다. 데이터는 SQL 저장 프로 시저를 통해 반입되며 꽤 잘 최적화 된 것으로 확신합니다. 각 레코드의 처리는 상당히 집약적입니다.

내 의사 코드 : 나는 배열이나 목록 <>는 DB가 모든 코드를 기다리고에서 해방되는 것이 "오프라인"그래서 잡아에 SqlDataReader 개체를 넣을 수 있습니다

string sql = "EXEC StoredProc" 
sqlConn.Open(); 
SqlCommand sqlComm = new SqlCommand(sql, sqlConn); 
SqlDataReader reader = sqlComm.ExecuteReader(); 

//loop through products 
while (reader.Read())  
{ 
    // do stuff 
} 

사이에서 실행 수백 천 번 - 기억에 많은 양의 데이터가있을 것이므로 문제를 개선하거나 악화시킬 것인가?

+0

정말 좋은 아이디어 인 것처럼 여기에서 많은 일이 일어나고 있습니다. 프로 시저를 통해 레코드 세트를 엽니 다. 그런 다음 거대한 레코드 세트를 반복하고 다른 테이블에 삽입하십시오. 다른 것들도 삽입하십시오. 이 엔드 투 엔드 디자인으로 올바른 결정을 내리고 있습니까? 이 레코드 세트를 반복하여 배열에 넣을 수는 있지만이 배열이 실행중인 모든 가난한 시스템에 200k 크기의 배열이 있습니다. – JNevill

+0

나는 당신이 듣는다 - 기본적으로 나는 원래 테이블의 모든 레코드를 읽고 다른 코드를 통해 일부 값을 실행하고 새로운 값을 다른 테이블에 써야한다. 그리고이 코드를 SQL 내부에서 코드로 사용할 수 없다. 그 처리는 꽤 복잡하고 C# 코드의 덩어리입니다. 나는 작은 덩어리로 과정을 일괄 처리 할 수 ​​있었지만 궁극적으로 나는 그것을 모두 처리해야한다고 생각한다! – chilluk

+0

JNevill의 의견에 대한 귀하의 답변을 보았으므로 CLR 절차를 작성하여 최상의 결과를 얻을 수 있다고 덧붙일 수 있습니다. –

답변

0

JNevill은 몇 가지 중요한 질문을 제기하지만 잠시 학구적 인 질문으로 다루어 보겠습니다.

은 내가 데시벨이 수백 수천 번

을 실행하는 사이에있는 모든 코드를 기다리고에서 해방되도록 그것을 "오프라인"잡아 배열이나 목록 <>에 SqlDataReader 개체를 넣을 수

물론 가능합니다.

많은 데이터가 메모리에 저장되므로 문제가 개선되거나 악화 될 수 있습니까?

그럼 이제는 당신이 더 나빠질 때마다 달라집니다 : 테이블을 데이터 보관함에서 잠 그거나 메모리에 전체 데이터 세트를 잠궈 야합니다. 어느 쪽도 보편적으로 더 좋든 나쁘 든간에, 비즈니스와 사용자에게 미치는 영향에 따라 다릅니다. 어느 쪽이든 당신의 의견으로는 더 나쁘다.

둘 다 받아 들일 수없는 경우 언제든지 옵션 C를 가져 와서 파일 시스템 객체를 사용하여 디스크의 플랫 파일에 즉시 쓸 수 있으므로 SQL 테이블을 잠근 상태로 유지하지 않고 데이터를 유지하지 못하게됩니다 메모리에. 그런 다음 무거운 처리를 파일 스트림으로 줄 단위로 처리하고 마지막으로 플랫 파일에서 데이터베이스로 쓸 수 있습니다.

처리 중에 테이블을 잠근 상태로 두지 않으면 다른 사용자가 테이블을 변경할 수 있으며 처리 된 데이터로 테이블을 덮어 쓰면 변경 사항이 손실됩니다. 다시 말하지만, 귀하는 귀하의 경우 어느 것이 더 나쁜지를 결정해야합니다.

+0

위와 같이 작은 덩어리로 일괄 처리 할 수 ​​있지만 필자는 원래 테이블의 모든 단일 레코드를 반복해야합니다. 나는 파일 시스템을 사용하는 것이 db에서 데이터를 "캐쉬"하는 방법이라고 생각한다. 그동안 메인 테이블에서 일어나는 다른 변화에 대해서는 상관 없다. – chilluk