Индексы в БД SQLite

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Индексы в БД SQLite

Сообщение neoksi » 12 ноя 2012, 19:14

Пытаюсь оптимизировать выборку из таблицы используя индексы, но что-то разобраться не могу как это сделать в SQLite под Андроид, есть у кого ссылки на подробные статьи по этому поводу?

У меня вылетает фатальная ошибка, после того как в sql запрос, после имени таблицы добавляю:

Код: Выделить всё

WITH (INDEX(my_index))
Может я что-то не так делаю?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Индексы в БД SQLite

Сообщение damager82 » 14 ноя 2012, 12:01

neoksi писал(а):Пытаюсь оптимизировать выборку из таблицы используя индексы, но что-то разобраться не могу как это сделать в SQLite под Андроид, есть у кого ссылки на подробные статьи по этому поводу?

У меня вылетает фатальная ошибка, после того как в sql запрос, после имени таблицы добавляю:

Код: Выделить всё

WITH (INDEX(my_index))
Может я что-то не так делаю?
Смотрите доки на их сайте, там все достаточно подробно, хоть и на английском
http://www.sqlite.org/lang_indexedby.html
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Индексы в БД SQLite

Сообщение neoksi » 14 ноя 2012, 13:08

damager82 писал(а): Смотрите доки на их сайте, там все достаточно подробно, хоть и на английском
http://www.sqlite.org/lang_indexedby.html
Тобишь после имени таблицы мне необходимо вместо WITH использовать INDEXED BY, попробую и отпишусь, а то 700мс на выполнение 168 запросов многовато ;)

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Индексы в БД SQLite

Сообщение neoksi » 14 ноя 2012, 14:50

Раза с 3го получилось реализовать, пришлось провайдер и хелпер подправить. Но к сожалению, нужного эффекта не дало, все равно теряю на каждой 4-5 операцией с БД 10-30мс.
На сколько смог отследить, теряю время на операции:

Код: Выделить всё

SQLiteDatabase db = dbh.getReadableDatabase();
В контент провайдере. Пока не понял, как тут оптимизироваться...

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Индексы в БД SQLite

Сообщение damager82 » 16 ноя 2012, 10:19

neoksi писал(а):Раза с 3го получилось реализовать, пришлось провайдер и хелпер подправить. Но к сожалению, нужного эффекта не дало, все равно теряю на каждой 4-5 операцией с БД 10-30мс.
На сколько смог отследить, теряю время на операции:

Код: Выделить всё

SQLiteDatabase db = dbh.getReadableDatabase();
В контент провайдере. Пока не понял, как тут оптимизироваться...
Транзакции используете? Они значительно ускоряют пакетные операции
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Индексы в БД SQLite

Сообщение rezak90 » 16 ноя 2012, 14:53

попробуйте ormLite, она быстрее работает.
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Индексы в БД SQLite

Сообщение neoksi » 16 ноя 2012, 17:59

damager82
Транзакции это мощная штука, но только в том случае, когда ты можешь передать множество запросов одновременно. У меня же работа с БД идет через ContentProvider, там в query можно передать только один запрос за раз, а в этом уже query происходит торможение на строке:

Код: Выделить всё

SQLiteDatabase db = dbh.getReadableDatabase();
Я пока не совсем понимаю можно ли в ContentProvider внедрить собственные методы, помимо стандартных, чтоб потом иметь к ним доступ. Чтоб получить доступ к провайдеру данных мы используем следующую конструкцию:

Код: Выделить всё

ContentResolver nimb = context.getContentResolver();
ContentResolver в свою очередь имеет интерфейсную поддержку только стандартных методов ContentProvider.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Индексы в БД SQLite

Сообщение neoksi » 16 ноя 2012, 18:03

rezak90 писал(а):попробуйте ormLite, она быстрее работает.
Как надстройка над sqlite может быстрее работать самой sqlite?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Индексы в БД SQLite

Сообщение rezak90 » 16 ноя 2012, 18:08

вы не поверите но может, почитайте про неё
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Индексы в БД SQLite

Сообщение neoksi » 16 ноя 2012, 18:27

rezak90
спорить не буду, но у меня есть свои убеждения. И переписывать действующее приложение на объектную модель бд... не.

У меня проблема не с самой скоростью sqlite, тут все просто прекрасно оказалось. Проблема с падением производительности при открытии БД. Если переформулировать мой изначальный вопрос, то теперь он звучит так:
"Как передать в ContentProvider более одного запроса за раз и вернуть массив ответов?"
Метод bulkInsert не предлагать, уже задействован под другие нужды.

Ответить