2009-12-29 4 views
1

인덱스가없는 SQL Server 테이블이 있는데이를 추가 할 수 없습니다. 해당 테이블에는 수백만 개의 레코드가 있으며 메모리 부족으로 단일 쿼리로 모든 레코드를 가져올 수 없습니다.인덱스가없는 작은 부분으로 SQL Server 테이블 데이터를 완전히 얻는 방법

모든 레코드를 작은 부분에 어떻게 가져올 수 있습니까? 예를 들어, 부분 당 100 레코드?

+0

이것은 DBA에게 슬픈 날입니다. –

+0

실제 질문은 현실 세계에서 실제로 발생하는 것이 아닌 시험 문제와 같습니다. –

+0

이미 발생했습니다 – user224564

답변

0

하나의 해결 방법은 - 덤프해야하는 모든 테이블을 선택하고, 식별 컬럼이있는 임시 테이블에 저장하는 것입니다. 그것은 ... 응용 프로그램과 데이터베이스 서버가 분리되어 있고 DB 서버에 충분한 메모리가 있으므로 수용 가능한 솔루션입니다. 하지만 아마도 더 효과적인 해결책이 있을까요?

1

기록을 어떻게 읽으려고합니까? SqlDataReader을 사용하면 메모리 부족 문제가 없어야합니다.


const string QUERY = "SELECT * FROM MyTable"; 
using (var conn = new SqlConnection(CONNECTION_STRING)) 
{ 
    using (var cmd = new SqlCommand(QUERY, conn)) 
    { 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       // Use properties and methods of the reader to access the current row 
      } 
     } 
    } 
} 

이 데이터베이스 연결을 통해 한 번에 당신에게 하나 개의 행을 전달합니다. 연결은 버퍼링을 수행하고, 데이터베이스에서 여러 행을 가져 와서 한 번에 하나씩 전달합니다.

+0

그리고 클라이언트와 서버 모두에서 여분의 메모리를 소비하지 않습니까? 클라이언트 측에서 전체 테이블을 캐시하면 - 나에게 좋지 않습니다. 인덱스를 가진 임시 테이블을 생성하고 그것을 사용한다면 - 나 자신의 방식으로 그러한 테이블을 처리하는 것이 더 편리 할 것이기 때문에 또한 좋지 않습니다. 그런데 어떻게 테이블에 인덱스없이 작동합니까? 열려있는 SqlConnection에서 일반적인 SQL 쿼리 만 사용하여 작업을 재현 할 수 있습니까? – user224564

+0

큰 테이블의 경우이 기능이 작동하지 않습니다 (수백만 개의 레코드가 있음 - "테이블이 너무 큽니다"예외가 발생 함) – user224564

+0

전체 Exception을 게시하십시오 .ExtOString()을 게시하십시오. –

1

커서가 실제 용도로 사용될 수있는 드문 경우 중 하나입니다.

통계 커서를 만들 수 있습니다 (테이블 데이터의 복사본을 만들지 만 클라이언트 측이 아닌 서버의 임시 데이터베이스에서이를 정렬하고 정렬).이 커서를 찾아 볼 수 있습니다.

0

Quassnoi가 이미 제안했듯이 한 가지 해결책은 서버 쪽 커서를 사용하는 것입니다. 그 단점은 전체 테이블의 복사본이 tempdb에 만들어 질 것임을 의미하는 정적 커서 여야한다는 것입니다.

또 다른 해결책은 행에 의해 행, 스트림 지향 방식에서 클라이언트 측을 처리하기 위해 (즉, 클라이언트 측 커서를 이동합니다.) :

using(SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) 
{ 
    while (rdr.Read()) 
    { 
    -- process one row here 
    } 
} 

당신이 밖으로 굽기없이 설정 큰 행을 처리 할 수있는이 방법을 모든를 클라이언트 측 메모리.

관련 문제