2011-09-25 2 views
1

SQL SERVER에 분할 된 테이블이 있고 ID에 클러스터형 인덱스가 있고 테이블이 period_key로 분할되어 있습니다. ID는 파티션 내부에서 고유하지만 고유 한 교차 파티션은 아닙니다. 필요한 모든 고유 ID를 찾는 것입니다. 가장 간단한 방법은C에서 DB에서 여러 정렬 된 데이터 집합을 정렬하는 방법 #?

select unique ID from tab 

를 사용하지만, 디스크 IO의 많은이 필요하므로 이러한 요구는 임시 디스크를 많이 종료해야 할 데이터베이스의 DB를 정렬 할 수 있습니다. 시스템은 이미 IO 경계에 있기 때문에 디스크 IO를 줄이려고 생각하고 있습니다. 클러스터 인덱스를 사용하여 각 파티션을 순서대로 읽을 수 있기 때문에 10 개의 파티션이 있다고 가정하고 각 파티션에서 하나의 행을 읽고 비교 한 다음 최소 ID, 예를 들어 파티션 X에서 레코드를 출력 한 다음 읽을 수 있습니다 파티션 X의 다음 행. 그리고이 10 개의 행을 다시 비교하여 최소 ID로 레코드를 출력합니다. 외부 정렬과 동일합니다.

C#에서는 경험이 없지만 java는 알고 있습니다. 아무도 내게 C#에서 그것을 구현하는 방법을 약간의 아이디어를 줄 수 있습니까?

+1

여기서 C#의 역할은 무엇입니까? linq-to-sql 솔루션을 원하십니까? SQL Server 자체에서 최적화 된 하나의 쿼리보다 데이터베이스에 대한 다중 왕복 이동을 만드는 솔루션이 더 낫다고 나는 거의 상상할 수 없습니다. 아니면 당신의 요점을 놓치고 있습니까? –

+0

중복 ('탭에서 고유 ID 선택')을 제거 하시겠습니까? 아니면 한 번만 발생하는 ID를 가져 오시겠습니까? –

답변

1

OK, DB 서버 측에서 정렬을 무시하고 클라이언트 측에서 ID가 고유하거나 아닌 경우 문제가 해결되면 다음과 같이 할 수 있습니다. - 모든 ID 값을 선택합니다 (별개 없음) 쿼리에 모든 값을 통해

SELECT ID FROM tab 

그런 다음 루프하는 List에 추가. 그 작업이 끝나면 중복 목록을 제거한 목록을 자신에게 돌려 줄 것을 요청할 수 있습니다. 다음은 단순한 예입니다.

List<int> allIDs = new List<int>(); 
foreach (DataRow row in someDataSet.Tables[0].Rows) 
{ 
    allIDs.Add((int) row["ID"]); 
} 
List<int> uniqueIDs = allIDs.Distinct(); 

면책 조항 - 본인의 머리 꼭대기에서 쓴 것이므로 오류가있을 수 있습니다. This post에는 HashSet을 기반으로하는 더 빠른 구현이 포함되어 있습니다.

관련 문제