2013-09-17 2 views
1

В моей базе данных SQLite имеется более 500 000 строк. Будучи новым, я только начал использовать дополнительные индексы в своем приложении VB.net с некоторыми потрясающими улучшениями скорости :).SQLite Индекс даты не показывает улучшения производительности

Эти улучшения не реплицируются при индексировании столбца Date моей таблицы. Я собираюсь включить некоторые фрагменты кода ниже, и буду признателен за любые данные о том, что я могу делать неправильно.

'When creating the date column in DB (amongst others) 
oMainQueryR.CommandText += "RDate DATE, " 

'creating index 
oMainQueryR.CommandText = "Create INDEX main.iRDate ON DatabaseRows(RDate)" 
     oMainQueryR.ExecuteNonQuery() 

'Storing the Data 
.Parameters.Add(":Rdate", DbType.Date) 
cmdSQLite.Parameters(":Rdate").Value = CDate(TextSplit(1)).ToString("dd/MM/yyyy") 



'SQL Call to retrieve data 
oMainQueryR.CommandText = "SELECT * FROM DatabaseRows " _ 
          & "WHERE DATE([RDate]) BETWEEN DATE(:StartDate) AND DATE(:EndDate) " _ 

звонки и все работает нормально, и я получаю правильную функциональность его просто нет никаких улучшений, когда индекс скорости колонки RDate мудр.

Следует отметить, что индекс, как представляется, будет создан правильно

бы признателен за любую помощь, спасибо

+0

Это не проблема VB.Net. Кроме того, строки в 500K кажутся немного чрезмерными, чтобы делать что-то в SQLite. Я предполагаю, что вы используете SQLite, чтобы избежать накладных расходов полной базы данных, что также может означать, что аппаратное обеспечение не очень хорошо. Возможно, это вопрос о чтении диска на данный момент? – Origin

+0

Это проблема VB.net, поскольку я использую Vb .net для написания приложения, чтобы применить предлагаемые улучшения, которые мне пришлось изменить в базе данных после того, как улучшения были в той же ошеломляющей категории, что и все другие. БОЛЬШАЯ ПОМОЩЬ спасибо. 500 тыс. Строк дали мне данные за день в 7сек, используя старый метод, теперь его почти мгновенный с этой точки зрения я не согласен с тем, что строки 500 тыс. Излишни для SQLite, по крайней мере Im ecstatic с новой производительностью, особенно учитывая, что я был доволен Старый. – user1500403

ответ

2

SQLite не использует индекс для этого поиска, потому что вы не ищете значение столбца, а результат вызова функции, и это не значение DATE(RDate), которое хранится в индексе.

Оставьте функцию DATE по вашему запросу; он ничего не делает в запросе, за исключением предотвращающих оптимизаций:

... WHERE RDate BETWEEN :StartDate AND :EndDate 

Чтобы проверить, является ли на самом деле использует SQLite индекса в запросе, используйте EXPLAIN QUERY PLAN.

Обращаем внимание: dd/MM/yyyy не относится к SQLite supported date formats; вы должны использовать yyyy-MM-dd для сравнения строк для правильной работы.

(Для поисков, как это, это не имеет большого значения, хранить ли вы дату в виде строки или числа.)

+0

Спасибо SOOOO за помощь, изменив даты в базе данных на yyyy-MM-dd и удалив функцию Date из вызова, сделали улучшения, которые я испытывал с другими индексами. – user1500403

2

рекомендуется хранить данные о дате в INTEGER (тип данных Date не внутренне поддерживается SQLite).

Это превратит запрос в

SELECT * FROM DatabaseRows WHERE RDate BETWEEN (:StartDate) AND (:EndDate); 

, который позволит избежать больших количеств DATE вызовов функций.

Действительно, ваш DATE вызов функции полностью отключает INDEX улучшение.

Кроме того, INTEGER сравнение намного быстрее, чем TEXT сравнение.

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