2012-03-28 3 views
0

저는 많은 수의 레코드에서 검색을 최적화하고 gridview에 표시 할 수있는 방법을 찾기 위해 테스트 응용 프로그램을 작성하고 있습니다.검색을 최적화하려면 어떻게해야합니까?

당분간, 20,000 개의 레코드 (색인이 생성되지 않음)가있는 테스트 테이블이 있으며, 20 개 배치의 레코드를 내 gridview에 표시하려고합니다. 나는 이것을 어떻게하는지 잘 모르겠다. 그리고 나는 그 이론을 이해하려고 노력하고있다. 당신이 볼 수 있듯이

namespace TestingIndexes 
{ 
    public partial class Default : System.Web.UI.Page 
    { 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void btnStart_Click(object sender, EventArgs e) 
    { 
     gvResults.DataSource = GetContacts(); 
     gvResults.DataBind(); 
    } 

    private List<Contact> GetContacts() 
    { 
     List<Contact> contacts = new List<Contact>(); 

     DataClasses1DataContext dc = new DataClasses1DataContext(); 

     // Track time elapsed 
     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 

     var result = from c in dc.GetTable<Contact>() 
     select c; 

     sw.Stop(); 
     ltMessage.Text = "<p>Time elapsed: " + sw.ElapsedMilliseconds + "</p>"; 

     if (result.Count() > 0) 
     contacts = result.ToList<Contact>(); 

     return contacts; 
    } 
    } 
} 

,이 LINQ를 사용하여 매우 간단한 쿼리와 나는 내가있는 gridview에 바인딩하기 위해 메모리에 모든 시간 만 개 기록을 데려 싶지 않아 확신 해요. 그래도 대안은 무엇입니까? 내가 뭘 찾고있는 궁극적으로 거기에 많은 레코드를 찾기 위해 데이터베이스를 쿼리하지만, 한 번에 20 레코드를 gridview에 표시됩니다 가정합니다. 이것은 SQL Server에서 처리되는 것입니까? 내가하려는 일에 대한 기사가 있어야한다고 확신하지만, 내가 무엇을 검색해야하는지 완전히 확신하지 못합니다. 튜토리얼에 대한 모든 포인터 또는 링크가 매우 유용합니다!

아무도 올바른 방향으로 나를 가리킬 수 있습니까?

+2

페이징 ......... –

+0

당신이 질문에있는 코드를 사용하는 보조 노트는 실제로'Count()'연산과'ToList()'연산을 위해 한 번씩 모든 데이터에 대해 데이터베이스를 두 번 쿼리합니다. 내 규칙은 절대로 (피할 수 있다면) 확장 메서드'Count()'를 사용하지 않는다. – Magnus

+0

.Count()를 사용하지 않고 레코드가 반환되었는지 어떻게 확인할 수 있을까? – alimac83

답변

4

SkipTake을 사용해야 데이터베이스 테이블에서 데이터의 일부를 가져올 수 있습니다.

var result = dc.GetTable<Contact>().Skip(40).Take(20).ToList(); 
+0

감사합니다 - 그러면 필요한 레코드를 검색하는 방법이 지워집니다. 그러나 나는 데이터의 '대량'을 어디에 저장할 것인지 혼란 스럽다. 예를 들어 데이터베이스를 쿼리하고 모든 레코드를 메모리로 가져온 다음 skip/take를 사용합니까? 아니면 이것을하는 더 효율적인 방법이 있습니까? 실례가 내 말투하지만 모든 레코드를 꺼내 SQL 서버의 임시 결과 테이블에 저장하고 다음이 결과 집합을 건너 뛰기/가져 오기를 사용할 수 있습니까? – alimac83

+0

아니, 내 대답에 쿼리하는 것은 지정된 행을 검색 만 SQL로 변환됩니다 – Magnus

+0

하지만 그건 이해가되지 않습니다. 물론 페이지를 넘길 때 임시 테이블에 레코드를 저장해야합니까? 그렇지 않으면 결과가 왜곡 될 페이징을하는 동안 레코드가 데이터베이스에 추가 될 수 있습니다 ... – alimac83

0

먼저 last와 allways는 반환 할 행을 가리키는 인덱스 인 테이블에 (클러스터 된) 인덱스를 작성합니다. 만약 당신이 그때는 SQL은 모든 레코드를 통해 단계 것입니다. 커버링 인덱스가있는 경우 SQL은 인덱스에만 액세스합니다. SQL에 대해 배우고 싶다면 http://www.sqlserverinternals.com/ Kalen Delaney보다 나은 소스가 없을 것입니다. "Covering indexes"와 훨씬 더 많은 것들이 모두 선명도로 설명 되어져 있으며 심지어 그녀의 책에 들어있는 것을 표면적으로 이해하면 오히려 더 나은 개발자가 될 것입니다. http://en.wikipedia.org/wiki/Database_index

관련 문제