Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.93
suvorov
5 / 5 / 0
Регистрация: 14.11.2012
Сообщений: 110
#1

Ускорение SELECT запроса в SQLite - Программирование Android

15.11.2013, 16:28. Просмотров 3968. Ответов 17
Метки нет (Все метки)

Добрый день! Имеется база на SQLite. Содержит следующую структуру таблиц:

Форум - Топик - Сообщения

При запросе одного форума, надо получить список топиков, и в каждом из топиком список сообщенией. В сумме таблицы содержат около 4 миллионов записей, но самая большая таблица "Сообщения".

Но при запросе хотя бы одного форума, программа обрабатывает это около 2х-3х минут, что очень долго. На компьютере на это уходит 3мс.

Вот мой код, может в нем что не так?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    ArrayList<Forum> listForums = new ArrayList<Forum>();
        
        String[] whereArgs = new String[] {Long.toString(id)};
        String[] forums = new String[] {"id","name","deel"};
        Cursor cursor = database.query("forum", forums, "id = ?", whereArgs, null, null, null);
        cursor.moveToFirst();
        
        while (!cursor.isAfterLast()) 
        {
            Forum forum = new Forum();
            forum.setName(cursor.getString(1));
            forum.setOmschrijving(cursor.getString(2));
            
            ArrayList<Topic> listTopic = new ArrayList<Topic>();
            
                String[] whereArgsCat = new String[] {Integer.toString(cursor.getInt(0))};
                String[] topics = new String[] {"idTopic"};
                Cursor cursorCat = database.query("ForumTopic", topics, "idForum = ?", whereArgsCat, null, null, null);
                cursorCat.moveToFirst();
                while (!cursorCat.isAfterLast()) 
                {
                    Topic topic = new Topic();
                    topic.setName(cursorCat.getString(0));
                    ArrayList<Messages> listMessages = new ArrayList<Messages>();
                        String[] whereArgsVert = new String[] {Integer.toString(cursorCat.getInt(0))};
                        String[] vert = new String[] {"id","name","deel"};
                        Cursor cursorVert = database.query("message", vert, "id IN(SELECT idMessage FROM topicmessage where idtopic=?)", whereArgsVert, null, null, null);
                        cursorVert.moveToFirst();
                        
                        while (!cursorVert.isAfterLast()) 
                        {
                            Messages message = new Messages();
                            message.setVoorOmschrijving(cursorVert.getString(0));
                            message.setName(cursorVert.getString(1));
                            message.setOmschrijving(cursorVert.getString(2));
                            listBetekenis.add(message);
                            cursorVert.moveToNext();
                        }
                        cursorVert.close();
                        topic.setListBetekenis(listMessages);
                    listTopic.add(topic);
                    cursorCat.moveToNext();
                }
                cursorCat.close();
                forum.setListCategory(listTopic);
                listForums.add(forum);
            cursor.moveToNext();
            }
        cursor.close();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2013, 16:28
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ускорение SELECT запроса в SQLite (Программирование Android):

Пример запроса к базе sqlite - Программирование Android
Подскажите пример запроса к базе с условием WHERE.

SQLite как записать результат запроса в переменную (Android, Java) - Программирование Android
Здравствуйте! Помогите, пожалуйста решить проблему. Необходимо получить кол-во записей в таблице. Для этого использую такой вот запрос:...

Vector и Select SQLite - C++
Здравствуйте. Столкнулся с двумя проблемами и не знаю в чём дело. Есть метод класса: std::vector&lt; std::vector&lt;char*&gt; &gt;...

Ускорение работы запроса - SQL Server
Есть запрос, вытягивающий информацию для отчета. С большими БД работает очень долго. Подскажите как его можно переписать. Буду признателен....

Скорость, касательное ускорение, полное ускорение, нормальное ускорение и радиус кривизны траектории - Механика
Движение точки задано координатным способом. Найти траекторию и начертить ее. Кроме того определить скорость, касательное ускорение, полное...

Ускорение обработки POST-запроса (Indy) - Delphi
Добрый день. Прежде чем задать свой вопрос, хочу немного пояснить ситуацию. Delphi изучаю довольно недолго. И решил от чтения книг...

17
dubok79
324 / 122 / 11
Регистрация: 01.11.2012
Сообщений: 586
19.11.2013, 19:17 #16
Вы не поняли, для чего нужны индексы.
Делайте индекс по idCategory для таблицы categorywoord
1
suvorov
5 / 5 / 0
Регистрация: 14.11.2012
Сообщений: 110
19.11.2013, 19:34  [ТС] #17
Цитата Сообщение от dubok79 Посмотреть сообщение
Делайте индекс по idCategory для таблицы categorywoord
Да, видимо не понял Сделал, индекс только для idCategory, запрос стал выполняться за 7 секунд! Это уже результат. Можно еще как-то ускорить дело?
0
dubok79
324 / 122 / 11
Регистрация: 01.11.2012
Сообщений: 586
19.11.2013, 19:39 #18
Еще можно пересмотреть запросы, код и многое еще. Ищите "узкое" место, где дольше всего выполняется. Почитайте про SQlite, ее саму тоже можно ускорить и значительно, но для разных случаев методы разные.
0
19.11.2013, 19:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 19:39
Привет! Вот еще темы с ответами:

Максимальная длина запроса SQLite - Lazarus
Здравствуйте, подскажите пожалуйста, есть ли максимальная длина запроса в базу SQlite3? Какая она? и можно ли её поменять? и как?

.NET 3.x SQLite Проверка на выполнение запроса - C#
SQLite Проверка на выполнение запроса //создание таблицы запрос таблицы command_SQL public int...

.NET 4.x Записать результат запроса к БД SQLite в массив - C#
Здравствуйте! Я разрабатываю приложение на Windows 8. К сожалению, очень мало документации в инетернете пока, не могла найти ответ на мой...

Sqlite ошибка при выполнении запроса - C++ Qt
выполняю запрос к базе, но не чего не получаю.. что не так?? query.exec(&quot;SELECT MAX(id) FROM vopros&quot;); qDebug() &lt;&lt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru