2017-05-09 8 views
0

연락처 목록이 포함 된 Firebird 데이터베이스와 각 연락처의 서비스 및 송장 목록이 있습니다.C# DataAdapter.Fill 성능 향상

고객 테이블의 크기 순서는 10k이며 인보이스/서비스는 연락처 크기의 약 5 배입니다. 테이블에 열이 많이 포함되어 있습니다 (최대 150 개). 나는 이것이 이상적이지 않다는 것을 안다. 불행히도, 그대로 부과 된대로 데이터베이스를 재 설계 할 수는 없다. 사실 그하여

DataTable dataTable = new DataTable(); 
dataTable.BeginLoadData(); 
FbDataAdapter fda = new FbDataAdapter(command); 
fda.Fill(dataTable); 
dataTable.EndLoadData(); 

나는 매우 실망 : 이제

, 나는 (사실, 거의 40-50%) 다음 코드를 사용하여 데이터의 순수한 페치에서 보낸 시간의 상당 부분을 Fill 전화를 걸면 30k 행을 가져 오는 데 약 20 초가 걸립니다. 이 부분을 향상시킬 수있는 희망이 있습니까? 이것을 개선하기위한 대안 (상업적 일 수 있음)은 무엇입니까?

+1

왜 30,000 개의 행을로드하고 있습니까? 보고서 작성 중입니까? –

+0

모든 것을 한 번에로드해야합니까? 그렇지 않다면 가장 쉬운 해결책은 일종의 페이징을 구현하는 것입니다 (읽기 : 한 번에 적은 수의 레코드를로드 한 후 다음 비트로 이동). – stybl

+0

일종의 - 예. 데이터 집합에서 유연하고 무거운 검색이 필요하기 때문에 버퍼 방식을 사용합니다. 메모리 기반 검색은이 경우 서버 측보다 훨씬 빠릅니다. – neggenbe

답변

0

글쎄, 의견에서 알 수 있듯이 여기서는 특별한 경우를 제외하고는 할 수있는 일이별로 없습니다. 내가 한 것은 많은 수의 (행이 아님)을 미리보기 열과 전체 (세부 사항) 데이터 열의 두 가지 범주로 나눈 것입니다. 아이디어는 한 번에 한 열씩 미리보기 데이터를 한꺼번에로드하고 요청시에만 세부 정보를로드하는 것입니다.

Overall: 5 runs, >16k rows, time includes all code in the question! 

Case 1: 4 preview fields (3 int, 1 float), 135(+4 preview) fields for full list 
Preview queries:   1063.3470 ms 
    Full queries:  25712.2665 ms 

Case 2: 12 preview fields (3 int, 9 float), 127(+12 preview) fields for full list 
Preview queries:   1457.1946 ms 
    Full queries:  25735.5247 ms 

Case 3: 13 preview fields (3 int, 9 float, 1 blob subtype 1), 126(+13 preview) fields for full list 
Preview queries:  4023.9923 ms 
    Full queries: 26777.5369 ms 


250 Queries with "WHERE" contstraint on a foreign key 
Returning 1052 row in total 
Total execution time 10348.0545 ms 

WOW :

지금 바로 아래의 경우에 배를 보라! 로딩 시간은 전체 목록보다 6 ~ 20 배 빠릅니다. 물론, 개별 데이터를 로딩 할 때 오버 헤드가 생길 것입니다 ... 글쎄, 그것을 테스트 한 후에, DB에 "where"조건으로 외래 키를 질의했습니다. 내가 실행 한 250 개의 쿼리 각각은 평균 42 밀리 초의 실행 시간 동안 평균 4 개의 행을 반환합니다. 사용자는 주어진 행의 DETAIL에 액세스 할 때마다 기다려야합니다 (이는 클릭하면되므로 내 경우에는 절대적으로 괜찮습니다).

결론 : 행 분할이 아닌 열 분할로 데이터를 분할하는 것이 핵심입니다.

+0

정말 멋진 방법입니다! 나는이 방법으로 칼럼으로 나누는 것을 고려하지 않았습니다. 우리 시스템에서는 모든 칼럼이 필요할 때 우리가 할 수 있을지 확신하지 못합니다. 확실히 명심해야 할 것이고 꽤 놀라운 세트입니다. 이 성능상의 영향이 MSSQL과 비슷한 지 궁금 할 것입니다. – Alex