2012-03-28 4 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, и я уверен, что я не хочу, чтобы приносить 20000 записей в памяти каждый раз, когда для того, чтобы привязать его к GridView. Какая альтернатива? Я полагаю, что то, что я хочу сделать, в конечном счете, запрашивает базу данных, чтобы узнать много записей, но есть только 20 записей за раз в gridview. Это что-то, что обрабатывается SQL Server? Я уверен, что должны быть статьи о том, что я пытаюсь сделать, но я не совсем уверен, что я должен искать. Любые указатели или ссылки на учебные пособия были бы очень полезны!

Может ли кто-нибудь помочь указать мне в правильном направлении?

+2

paging ......... –

+0

В качестве побочного примечания с использованием кода в вашем вопросе будет фактически запрашивать базу данных дважды для всех данных, один раз для операции «Count()» и один раз для операции «ToList()»). Мое правило никогда (если его можно избежать) используйте метод расширения 'Count()' – Magnus

+0

Итак, как бы вы проверили, что были возвращены записи без использования .Count()? – alimac83

ответ

4

Вы должны использовать Skip и Take, чтобы получить части данных из таблицы базы данных.

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

Спасибо - это очищает способ получения необходимых записей. Однако я смущен тем, где хранить «объемные» данные. Например, я запрашиваю базу данных и вытаскиваю ВСЕ записи в память, а затем использую пропускать/принимать это? Или есть более эффективный способ сделать это? Извините мою плохую формулировку, но можно ли вытащить все записи и сохранить их в таблице результатов temp на сервере sql, а затем использовать пропустить/принять этот набор результатов? – alimac83

+0

Нет, запрос в моем ответе будет переведен на SQL, который будет извлекать только указанные строки. – Magnus

+0

Но это не имеет смысла. Разумеется, записи должны храниться во временной таблице для вас? В противном случае записи могут быть добавлены в базу данных, пока вы будете пейджинговать, что исказит результаты ... – alimac83

0

Во-первых, в прошлом и построить ВСЕГДА (кластерный) индекс таблицы В идеале индекс покрытия строки, которые вы хотите, чтобы вернуться, а также. Если вы не сделаете, то SQL выполнит ВСЕ записи. Если индекс покрытия установлен, SQL будет иметь доступ только к индексу. если вы хотите узнать о SQL, то, вероятно, нет лучшего источника, чем http://www.sqlserverinternals.com/ Kalen Delaney. «Покрытие индексов» и многое другое объясняются с ясностью и даже поверхностным пониманием того, что в ее книге сделают вас намного лучшими разработчиками, и есть http://en.wikipedia.org/wiki/Database_index

Смежные вопросы