2015-05-08 4 views
1

Простой запрос SQLite SELECT на Windows Phone очень медленный на устройстве высокого класса (Lumia 930).SQLite SELECT очень медленный на Windows Phone

select * from tableName 

Это выборка около 15000 записей (да, я их) и, как правило, я бы ожидать, что она не будет это медленно. Однако для получения всех записей требуется около 12-13 секунд. Я использую клиент SQLite.Net-PCL.

Что может быть причиной этого? Это правда, что это due to the very slow wrapper? Есть ли обходной путь, каким-либо образом его улучшить?

EDIT: Я попытался использовать SQLite PCL from Microsoft Open Technologies, и я вручную сопоставил свойство по свойству, и я получил гораздо лучшие результаты. Таким образом, кажется, что количество строк, количество столбцов и отражение, все вместе, заставляют вещи замедляться. Теперь я работаю над попыткой представить аналогичную функциональность через SQLite.NET-PCL, библиотеку, которую я использую, чтобы посмотреть, как это будет происходить.

EDIT2: Я ответил на ответ Питера как на свой вопрос, так как мне удалось значительно улучшить производительность, вручную сопоставив тип по типу, используя Prepare call и stepping by row by row.

+0

Зачем вам все они нужны за один раз, вам нужны все столбцы. Я бы этого не сделал, если у меня не было выбора на сервере с высоким уровнем ... –

+0

Ваше приложение действительно способно отображать информацию о всех 15000 записях на экране телефона одновременно? –

ответ

1

SQLite может легко вернуть 15 000 записей из простой таблицы за долю секунды на Windows Phone (проверено на Lumia 920).

Есть и другие причины, вызывающие низкую производительность. Если у вас огромное количество столбцов, это может быть проблемой. В зависимости от того, как реализована оболочка SQLite (я не знаю), двумя возможными виновниками являются использование Reflection для заполнения ваших объектов результата или для каждой строки Async. Но опять же, я не знаю, как именно эта оболочка реализована.

Способ ускорения (за исключением возврата данных) заключается в том, чтобы написать свой код на C++ и обернуть его в компонент WinRT, который будет вызываться вашим управляемым приложением.

+0

Можете ли вы рассказать мне, какие библиотеки и какая оболочка (точные версии, если возможно) вы использовали, чтобы убедиться, что вы можете получить 15 000 запросов так быстро? Я тоже хотел бы попробовать, и посмотреть, не вызвали ли они эту проблему. Я попытался уменьшить количество столбцов только на 2, но это все равно занимает 3 секунды, что по-прежнему довольно плохо (и у меня нет всех необходимых мне данных :)) –

+0

Способ получения наилучшей производительности - не использовать обертка - писать напрямую против API C. Я использую свою собственную библиотеку, которая работает с SQLite 3.8.7.4 –

+0

Я отмечаю это как ответ, поскольку ручное сопоставление типов помогло мне значительно улучшить производительность. –

0

В зависимости от того, какую информацию вы хотите получить от своих сущностей, вы можете попробовать использовать метод Query<>(), который позволяет вам писать исходный SQL-запрос, а затем вы можете выбрать только те поля, которые вас интересуют, и сопоставить их с более легкими объектами, если это возможно, даже если вы получаете все поля для своей цели Query<>() все равно должны быть быстрее.

Также проверьте, используете ли вы драйвер для SQLite для временного хранения

+0

Я уже использую 'Query ' для выполнения необработанного запроса. Я не использую последний драйвер SQLite, потому что последний из них вызывает ошибку SQLite при выполнении UpdateAll/InsertAll, но я попытался использовать его только для запроса, и для получения объектов требуется одно и то же время. –

Смежные вопросы