2012-10-07 4 views
0

나는 쿼리를 사용해야하는 120 만 개 이상의 큰 테이블을 가지고 있습니다. 같은 필드에 포함됩니다. 목록을 사용하여 쿼리해야하는 필드 combine_name이 있습니다. 성능을 확인하기위한 하나의 필드만으로이 작업을 수행하려고 노력 중이며 코드에 반영되어 있습니다. 내가 쓰는 방식은 너무 오래 걸린다. 테이블을 메모리에로드 할 필요가없는 방법이 있습니까?큰 테이블 및 목록 개체를 쿼리하는 방법

JDataClassDataContext db = new JDataClassDataContext(); 
var fullName = txtSearchBox0.Text.Trim(); 
List<string> firstName = new List<string>(txtSearchBox1.Text.Split(',').Select(x => Convert.ToString(x)).ToList()); 

var rows = (from c in db.defendants_ALLs.AsEnumerable() 
     where c.combined_name.Contains(fullName) 
      && firstName.Any(n => c.combined_name.Contains(n)) 
     select c).ToList();  

dlSearch.DataSource = rows; 
dlSearch.DataBind(); 
+0

당신은 데이터베이스 테이블의 필드로 fullname을 가질 수 없습니까? 현재 설정에서 rdbms가 인덱스를 사용할 방법이 없습니다. 전체 테이블 스캔으로 넘어져 성능이 저하됩니다. – rene

+0

fullname은 사용자가 입력해야하는 웹 페이지의 필드이므로 데이터베이스에 입력 할 수 없습니다. 필자는 txtSearch0 및 txtSearch1 필드에 각각 올바른 이름의 combine_name을 검색하는 입력이 필요합니다. 예를 들어 txtSearch0 = 'smit'이고 txtSearch1 = 'joh, jon, j'입니다. 모든 다른 철자법과 임의의 j를 얻기 위해서. 스미스는 우연히 우리가 얻는 데이터에있을 것입니다. 저장 프로 시저가이 시점에서 가장 좋은 옵션 일 수 있다고 생각합니다. – korrowan

답변

1

체크 아웃 Skip()Take() 방법을 참조하십시오.

당신은 다음과 같이 사용할 수 있습니다 : amountotherAmount가 실제로 데이터베이스에서 인출 할 기록의 양을 나타냅니다

var rows = (from c in db.defendants_ALLs.AsEnumerable() 
      where c.combined_name.Contains(fullName) 
      && firstName.Any(n => c.combined_name.Contains(n)) 
      select c).OrderBy(o => o.id).Skip(amount).Take(otherAmount).ToList(); 

. 즉, instace에 대해서만 120 개의 레코드를 요청할 수 있습니다. (예 : .ToList() 일 경우 일어날 일)

+0

skip() 및 take()를 사용하면 모든 올바른 레코드를 얻을 수 있습니까? 문제는 필드에 'smith john', 'smith j.', 'john smith', 'john d'와 같은 문자열을 포함 할 수 있다는 것입니다. 스미스 ','스미스 d. 존 ','스미스 존 d '. – korrowan

+0

당신이 "정확한 기록"이라고 부르는 것에 달려 있습니다. 건너 뛰기 & 가져 오기를 사용하면 이름에 "존"이 들어있는 40 개의 레코드를 가져올 수 있지만 실제로는 "John"이라는 이름이 포함 된 200 개가 넘는 레코드가있을 수 있습니다. 다른 레코드는 데이터베이스에서 가져올 수 없습니다. – Thousand

+0

'올바른 레코드'는 'jon, joh, j'가 포함 된 모든 레코드입니다. 그리고 '스미트'. 그런 다음 사람의 입력 오류 때문에 이러한 레코드를 손으로 축소해야합니다. – korrowan

1

가장 좋은 방법은 다음과 같은 좋은 oldfasion SQL 쿼리를 생성하는 것입니다. "combined_name LIKE '% fullname %'와 firstName IN ('first', 'next'...)의 테이블 선택 필드 SqlConnection과 SqlCommand 및 SqlDataReader를 살펴보아야합니다. 그것은 linq보다 조금 더 다르지만 훨씬 빠릅니다 (올바른 색인이있는 경우)

+0

저장 프로 시저를 사용하는 것이 더 빠릅니까? 색인은 정확하고 우리는 이미이 같은 기능을 수행하는 Access 응용 프로그램을 가지고 있지만 우리는 Access를 제거하고자합니다. – korrowan

관련 문제