Запрос по диапазону в SQLite

У меня есть таблица SQLite, в которой есть масса данных, миллионы строк. Каждую секунду вставляется строка.

В строках есть столбец для даты создания, который преобразуется в миллисекунды с начала эпохи и сохраняется в виде числа, например 1343224574667. В каждой строке также есть столбец для идентификатора контейнера, это просто строковое поле.

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

Select * from Item where Created > [number] and Created < [number] and ContainerId=[string]

Довольно простой запрос.

У меня есть несколько индексов на столе. Есть один на [Created], и еще один на [Created, ContainerId]. Когда я запускаю этот запрос в небольшом диапазоне времени, запрос выполняется довольно быстро, например, за несколько сотен миллисекунд. Однако расширьте его так, чтобы временной диапазон простирался на неделю или около того, и этот запрос был очень медленным, в среднем более 75 секунд. Есть ли способ ускорить это? Кажется, это безумно долго ждать результатов. Но я не администратор базы данных, так что, возможно, я делаю что-то не так.

Спасибо!


person KevinGreen24    schedule 23.08.2012    source источник
comment
Больший диапазон, вероятно, имеет гораздо более разные идентификаторы ContainerId. Что произойдет, если вы измените порядок столбцов в индексе? [ContainerID, Created]?   -  person Nikola Markovinović    schedule 23.08.2012
comment
Это все еще было медленно, но это может быть только этот конкретный случай. Должен ли я иметь индексы в обоих направлениях, чтобы охватить оба случая? Или это слишком...   -  person KevinGreen24    schedule 23.08.2012
comment
Я думаю, это было бы слишком. Не уверен, насколько Sqlite использует статистику, чтобы иметь возможность выбирать среди похожих индексов. Тем более, что кажется, что проблема заключается в поиске строк (много чтений из таблицы Item).   -  person Nikola Markovinović    schedule 23.08.2012
comment
Возможно, это также как-то связано с тем, что в таблицу постоянно записываются данные. Есть ли какая-то концепция запроса WITH (NOLOCK), как в SQL Server?   -  person KevinGreen24    schedule 23.08.2012
comment


Ответы (1)


кластеризованный индекс может ускорить выполнение запросов по диапазону. В случае SQLite это, вероятно, означает использование первичного ключа. Если можете, попробуйте сделать (Created, ContainerId) ПЕРВИЧНЫМ КЛЮЧОМ таблицы.

person Sameer    schedule 23.08.2012
comment
К сожалению, это не вариант. Каждая строка имеет свой уникальный идентификатор. - person KevinGreen24; 23.08.2012