2017-01-03 7 views
1

У меня есть база данных sqlite с около 22 миллионами записей. У меня есть индексы на правильных столбцах (в столбцах «где»). Когда я делаю запрос (который возвращает около 80 000 строк), используя sqlitestudio (редактор sqlite), запрос занимает около секунды для запуска. Но я подозреваю, что это связано с какой-то формой разбивки на страницы.Как ускорить доступ к данным?

Однако .. когда я запускаю тот же запрос в C# с использованием system.sqlite.data, потребуется итерация через 80 000 записей.

Есть ли способ ускорить это? Должен ли я, возможно, написать обертку на sqlite.dll?

Я проверил план выполнения и его то же самое в sqlitestudio и в коде C#. Similar issue

Хотя догадывался ответы оценены и могут дать представление (а иногда и ответ) Я был бы признателен конкретные ответы (то есть те, которые вы знаете, что на самом деле работает)

Heres код ...

using (var command = new SQLiteCommand(conn)) 
{ 
    command.CommandText = "select cell, lat, lon from cell_towers where mcc = @mcc and net = @net "; 
    command.Parameters.AddWithValue("@mcc", MCC); 
    command.Parameters.AddWithValue("@net", MNC); 
    using (SQLiteDataReader rdr = command.ExecuteReader()) 
    { 
     // In here it takes around 1-2 minutes to loop through. Even with no code inside the loop 
     while (rdr.Read()) 
     { 

     } 
    } 
} 

Edit 1:

Я запустить тот же запрос с использованием sqlite3.exe (программа командной строки можно скачать с sqlite.org) а и его выход переходит в консольное окно. Это займет много времени, чтобы перебрать все записи и распечатать их в командном окне .. но помните ... его ПЕЧАТЬ в КОМАНДНОЕ ОКНО ....

+0

Не знаю, не было меня - но .. это занимает 1-2 минуты за цикл? что кажется невероятно медленным, что происходит, если (если вы не хотите что-то сделать лучше), поскольку вы скрыли то, что он делает в цикле, вы просто берете данные у своего читателя и просто пишете необработанный объект на локальный диск. оптимизирует это, все еще так долго? – BugFinder

+0

Вот как долго требуется, чтобы весь результирующий набор был зациклен даже с НИЧЕГО в цикле. Это та часть, которая меня заводит. Но даже с кодом в (простое назначение свойств класса из столбцов) это по-прежнему занимает столько времени. Как вы думаете, поможет ли индекс в столбцах результатов? – Eminem

+0

Сделал небольшое изменение в моем комментарии к моменту – Eminem

ответ

0

Простое индексирование каждого столбца не всегда полезно. Если поиск на двух колонках потребовало бы один индекс на обоих столбцах:

CREATE INDEX cell_towers_mcc_net ON cell_towers(mcc, net); 

A covering index для этого запроса может быть даже быстрее, по чуть-чуть:

CREATE INDEX cell_towers_mcc_net_cov ON cell_towers(mcc, net, cell, lat, lon); 

, но, вероятно, нуждается в большем количестве хранения чем это стоит.

Если столбцы mcc/net являются первичными ключами, вместо этого используйте вместо этого clustered index.

+0

Спасибо за ответ. Мне просто интересно об этом. У меня есть индексы на этих столбцах (mcc, net). Я просто использую sqlite3.exe для экспорта данных в csv. Это займет около 20 секунд. Это намного быстрее, чем минута или 2, я должен ждать. Итак, я рассматриваю возможность сбрасывания файлов в файл, а затем чтение его с помощью StreamReader – Eminem

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

  • Нет связанных вопросов^_^