2011-01-12 4 views
3

저는 현재 이전 데이터베이스를 새로운 스타일로 변환하는 프로그램에서 작업하고 있습니다. 할당 된 작업 중 하나는 오래된 바이너리 열을 제거하고이를 리포지토리의 문서로 변환하는 것입니다..NET - 쿼리가 완료되기 전에 DataReader에서 읽기 시작 하시겠습니까?

테이블에 약 110 만 개의 행이 있으며 완료하려면 약 12 ​​시간이 걸립니다.

저는이 모든 것이 조금 더 빨라질 수있는 방법을 찾고 있습니다. 제가보고있는 한 가지 방법은 데이터를 더 빨리 얻는 것입니다. 완료되기 전에 쿼리 결과에 접근 할 수있는 방법이 있다면? 쿼리 분석기에서이 테이블에 대해 "select *"문을 실행하면 즉시 결과가 반환되기 시작하지만 .NET에서 ExecuteReader를 사용하면 해당 쿼리가 약 30 분 정도 걸려서 행 읽기를 시작할 수있는 것으로 나타났습니다. .

+0

실제 코드는 어떻게 생겼습니까? 인덱싱되지 않은 열에 무거운 where-queries가있는 것 같습니다. 수백만 열에도 필터링하지 않고 일반 SELECT를 수행하는 것은 ExecuteReader에서도 빠르다. –

+0

어쩌면 당신은 더 적은 수의 열로 쿼리를 해부하고 그들을 처리하기 위해 몇 개의 쓰레드를 실행할 수 있습니까? – clyc

+0

@ Pauli - 문제는 데이터의 양만큼이나 색인이 아닙니다. 몇 가지 BLOB 열을 다루고 있습니다. : ( –

답변

1

command.ExecuteReader(CommandBehavior.SequentialAccess)을 사용하는 것이 도움이 될 수 있습니다. 그러나 이렇게하려면 순서대로 열을 읽어야하며 다른 방법으로 이진 값을 읽어야합니다. reading the documentation on SequentialAccess을 권장하므로 코드의 다른 변경 사항을 확인해야합니다.

쿼리 분석기에서 동일한 쿼리가 즉시 실행되는 것을 고려하십시오. 즉, 쿼리가 본질적으로 첫 번째 결과를 반환하는 데 30 분이 걸리지 않거나 쿼리 분석기에서 결과가 반환됩니다. 큰 이진 값을 처리하는 것이이 불일치에 대한 가능성있는 설명이라고 생각합니다. 한 가지 빠른 방법은 쿼리를 변경하여 이진 열을 제외한 모든 항목을 선택하고 ExecuteReader가 걸리는 시간을 변경하는지 확인하는 것입니다. 실행 시간이 바이너리 열없이 동일하다면 SequentialAccess가 도움이되지 않을 것입니다. 바이너리 열이 없으면 더 빠른 경우 SequentialAccess를 사용하는 것이 좋습니다.

+0

QA에서 쿼리를 완전히 반환하는 데는 30 분이 걸리며 즉시 데이터의 일부만 반환되기 시작합니다. SqlCommand.BeginExecuteReader를 사용하여 코드에서 이펙트를 복제 할 수있게되었습니다. 이 제안을 다음에 시도해보고 전체 시간을 알아 보겠습니다. –

+0

총 성능 향상의 대부분은 SqlCommand.BeginExecuteReader를 사용하여 얻은 것이지만 이로 인해 좋은 영향을 미쳤습니다. 총 시간이 단축되었습니다. 12 시간에서 1.5 시간. –

관련 문제