в эмуляторе Windows Phone 7 запрос многие ко многим выполняется медленно - PullRequest
0 голосов
/ 21 июля 2011

мое приложение использует sqlite для базы данных. в базе данных у меня отношения многие ко многим. Когда я использую аддон / инструмент sqlite для Firefox, SQL-запрос, соединяющий таблицы во множестве многих, выполняется довольно быстро. однако, когда я выполняю тот же запрос на эмуляторе, это занимает очень много времени (5 минут и более). таким образом, я даже не пробовал его на реальном устройстве.

Может кто-нибудь сказать мне, что происходит?

например, у меня есть 3 таблицы. 1. создать таблицу person (целое число, имя, текст); 2. создать таблицу курса (целое число, текст имени); 3. создать таблицу регистрации (personId integer, courseId integer);

Мои SQL-заявления, которые я пробовал, выглядят следующим образом.

select * 
from person, course, registration
where registration.personId = person.id and registration.courseId = course.id

, а также следующим образом.

select *
from person inner join registration on person.id=registration.personId
inner join course on course.id=registration.courseId

Я использую клиент sqlite из http://wp7sqlite.codeplex.com. У меня 4800 записей в таблице регистрации, 4000 записей в таблице персон и 1000 записей в таблице курсов.

это мои запросы? это просто клиент sqlite? это рекордный размер? если эта проблема не может быть исправлена ​​в приложении, я боюсь, что мне придется перемещать базу данных удаленно (это означает, что моему приложению придется использовать Интернет).

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Да, это ваши запросы.Вам не сойдет с рук, вы можете сойти с рук, делая то, что вы пытаетесь сделать на мобильном устройстве.Вы должны помнить, что вы не работаете на ПК, поэтому вы должны по-другому думать о том, как вы подходите к вещам (как коду, так и к пользовательскому интерфейсу).У вас мало памяти, медленный доступ к диску, медленный процессор, нет виртуальной памяти и т. Д. Вам придется идти на компромиссы.

Я уверен, что все, что вы делаете, вполне возможноделать на телефоне без необходимости внешнего сервера, но вы должны быть умными об этом.Например, действительно ли необходимо загружать все 4800+ записей в память одновременно?Почти наверняка нет, пользователь не может смотреть на все 4800 одновременно.Если забыть о скорости работы базы данных, просто показывать это количество элементов в ListBox может снизить производительность вашего приложения.

И даже если производительность была идеальной, отображение 4800 элементов действительно является хорошим опытом для пользователя?Конечно, было бы лучше, если бы пользователь мог ввести поисковый запрос, и он позволил бы отфильтровать список до более удобного размера.Можете ли вы реализовать разбиение на страницы, чтобы отображать только первые 10 записей, и чтобы пользователь нажимал кнопку «Далее» для следующих 10?

Возможно, вы также захотите отменить нормализацию своей базы данных, чтобы у вас была только одна таблица, а не3. Это значительно улучшит производительность.Да, это противоречит всему, чему вас учили о базах данных в школе, но, как я уже сказал: телефон = компромиссы.И помните, что это не большая важная база данных OLTP, это приложение для телефона - никого не волнует, находится ли ваша база данных в 3-й нормальной форме или нет.Также помните, что чем больше вы работаете с телефоном (тратит время на сбор данных), тем больше энергии потребляет ваше приложение.

Наконец, если вы абсолютно уверены, что должны предоставить пользователю список из 4800 записей дляпрокрутите, вы должны взглянуть на какую-то технику виртуализации данных.Это дает пользователю иллюзию, что они прокручивают длинный список, хотя на самом деле в каждый момент времени загружается только несколько элементов.

Но короткий ответ таков: да, выполнение таких запросов будет проблематичным,вам нужно подумать об их изменении.

1 голос
/ 21 июля 2011

К тому времени, как вы начнете делать эти объединения, вы получите достаточно большое количество записей.Как выглядит память во время этой операции?

Предполагая, что вы настроили индексы надлежащим образом, вместо того, чтобы делать это с объединениями, я бы попробовал три отдельных запроса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...