SQLite Querying - очень медленный для большого набора данных

В настоящее время я выполняю запрос, который выглядит так:

    Select Name from Location Where Created > (long value of date)
    and 
    Created < (long value of date) and LocationContainer = 'a string'

Длинное значение даты, означающее миллисекунды с начала эпохи, мы используем его для хранения дат.

У меня есть индекс, построенный на LocationContainer, созданный в таком порядке.

У меня есть запрос, который возвращает 1,3 миллиона строк, но его выполнение также занимает около 40 секунд. Это правильно? Разве этот запрос не должен быть намного быстрее, поскольку поля, которые я запрашиваю, индексируются? Что мне не хватает?


person KevinGreen24    schedule 14.08.2012    source источник
comment
Насколько я помню, SQLite предназначен для небольших (может быть, несколько 100 тыс. строк?) баз данных, не таких больших, как эта. Вы уверены, что хранить такое количество данных нужно с помощью этого инструмента? Я бы скорее предложил Firebird, например.   -  person GergelyPolonkai    schedule 15.08.2012
comment
Производительность SQLite не соответствует уровню больших серверов баз данных, но он может отлично обрабатывать миллионы строк.   -  person moatPylon    schedule 15.08.2012


Ответы (1)


Вы пытались изменить порядок выражений where? Я ни в коем случае не эксперт, но я считаю, что выражения в предложении where должны указывать столбцы в том же порядке, в котором они были определены в составном индексе. Таким образом, ваш запрос должен превратиться в что-то вроде:

SELECT Name FROM Location
WHERE LocationContainer = 'a string'
  AND Created > (long value of date)
  AND Created < (long value of date)

По существу, если у вас есть составной индекс, состоящий из столбцов A, B, C. Запрос, в котором предложение where указывает столбцы A, B, C в этом порядке или A, B, будет использовать индекс.

person Edward L    schedule 14.08.2012
comment
Я попробую это и вернусь к вам. Я полагаю, что пробовал это раньше без изменения результатов, но я попробую еще раз. - person KevinGreen24; 15.08.2012
comment
Хм... что вы получите, если запустите EXPLAIN QUERY PLAN ‹ВАШ ЗАПРОС› в командной строке sqlite? Если он возвращает что-то вроде 0|0|TABLE Location WITH INDEX ‹my_index_name›, он использует индекс, но если он просто возвращает имя таблицы без WITH INDEX... тогда что-то работает неправильно. - person Edward L; 15.08.2012