1

У меня есть большой файл базы данных .sdf на мобильном устройстве Windows, которое мне нужно запросить. Файл содержит 40 000 записей. Я пытаюсь сократить время, затрачиваемое на выполнение запроса. В настоящее время это около 8 секунд, что очень много времени, чтобы пользователь мог дождаться результатов.Самый быстрый способ запросить файл базы данных SQL Server CE в Windows Mobile 6.5?

Сначала я использовал DataSet, установив SqlCeConnection и заполняющий адаптер, подключенный к набору данных. Также попытался схожий с DataTable, результаты работы были почти одинаковыми. Используя DataSet или DataTable завершенный запрос за 8 секунд.

Последнее, что я пробовал, - это просто использовать Reader(). Это дает мне несколько лучших результатов, но только на полсекунды (запрос завершен за ~ 7.5 секунд).

string lastName; 
lastName = ""; 
string connectionString = @"Data Source='/Path/To/MyDatabase.sdf' Max Database Size = 128; Max Buffer Size = 1024;"; 
string strSql = "SELECT LastName FROM employee_list WHERE LastName = 'Johnson'"; 

using (SqlCeConnection mConnection = new SqlCeConnection(connectionString)) 
{ 
    mConnection.Open(); 

    using (SqlCeCommand mCommand = new SqlCeCommand(strSql, mConnection)) 
    { 
     using (SqlCeDataReader reader = mCommand.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       lastName = (string)reader["LastName"]; 
      } 
     } 

     mCommand.Dispose(); 
    } 

    mConnection.Close(); 
    mConnection.Dispose(); 
} 

Любые идеи, как я могу сделать это быстрее?

+2

создать индекс на LastName. – Will

+0

Спасибо! Это было так. Его 8 секунд на самом первом сканировании и 1 секунда при каждом следующем сканировании. Как предварительно загрузить индекс столбца, чтобы скрыть задержку при первом сканировании? – 22332112

+0

Не уверен. Вы можете сделать это при первом запуске в фоновом режиме, я полагаю ... – Will

ответ

0

У меня была аналогичная проблема, хотя на iOS, где нам нужно было запросить более 100 000 записей. Первоначально мы использовали технологию ... похожую на инфраструктуру сущности в мире Windows (известную как CoreData) ... которая занимала более 15 секунд для выполнения (более 20 полей в запросе). Мы изменили это:

1) Теперь он использует SQLite непосредственно для запроса из 2-х частей. Часть 1 запрашивает только 3 поля и индексируется.

2) Часть 2 представляет собой последующий запрос, который работает, который захватывает «реальные данные» пользователь заинтересован в.

Это работает для нас, потому что сначала пользователь видит только список, и не нужен полный набор данных на данный момент. Только при выборе определенных строк для них требуется полный запрос «часть 2».

Не знаю, помогло ли вам это, но сократило наше время запроса до ~ 1100 мс, что стало большим улучшением в нашем конкретном случае.

+0

Вы предварительно загружаете или предварительно заполняете эти индексы каким-то образом на этапе настройки? – 22332112