Как я могу улучшить производительность базы данных SQLite? - PullRequest
1 голос
/ 26 апреля 2011

Справочная информация: Я использую базу данных SQLite в своем приложении Flex.Размер базы данных составляет 4 МБ и имеет 5 таблиц, которые

  1. таблица 1 имеет 2500 записей
  2. таблица 2 имеет 8700 записей
  3. таблица 3 имеет 3000 записей
  4. таблица 4 имеет 5000 записей
  5. таблица 5 имеет 2000 записей.

Проблема: Всякий раз, когда я запускаю запрос выбора для любой таблицы, онтребуется около (около 50 секунд) для извлечения данных из таблиц базы данных.Это делало приложение довольно медленным и не отвечало на запросы, пока оно извлекало данные из таблицы.

Как повысить производительность базы данных SQLite, чтобы сократить время, необходимое для извлечения данных из таблиц?

Спасибо

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

Как я сообщаю вам в комментарии, не зная, из каких структур состоит ваша база данных, и какие запросы вы выполняете к данным, мы не можем сделать вывод о том, почему ваши запросы занимают много времени.

Однако вот интересное чтение об индексах: Используйте индекс, Люк! . Он говорит вам, что такое индекс, как вы должны разрабатывать свои индексы и какие выгоды вы можете получить.

Кроме того, если вы можете опубликовать запросы и схемы таблиц и количество элементов (не содержимое), возможно, это может помочь.

3 голосов
/ 26 апреля 2011

Используете ли вы асинхронный или синхронный режимы выполнения?Разница между ними заключается в том, что асинхронное выполнение выполняется в фоновом режиме, а приложение продолжает работать.Тогда вашему приложению придется прослушать отправленное событие и затем выполнить любые последующие операции.Однако в синхронном режиме пользователь не сможет взаимодействовать с приложением, пока не завершится работа с базой данных, поскольку эти операции выполняются в той же последовательности выполнения, что и приложение.Синхронный режим концептуально проще для реализации, но асинхронный режим даст лучшее удобство использования.

В первый раз SQLStatement.execute() в экземпляре SQLStatement оператор подготовлен автоматически перед выполнением.Последующие вызовы будут выполняться быстрее, если свойство SQLStatement.text не изменилось.Использование одинаковых SQLStatement экземпляров лучше, чем создание новых экземпляров снова и снова.Если вам нужно изменить свои запросы, рассмотрите , используя параметризованные операторы .

. Вы также можете использовать такие методы, как откладывание необходимых данных во время выполнения.Если вам нужна только часть данных, сначала извлеките их, а затем извлеките другие данные по мере необходимости.Это может зависеть от области применения вашего приложения и того, что вам необходимо выполнить.

Указание базы данных с именами таблиц не позволит среде выполнения проверять каждую базу данных на предмет поиска соответствующей таблицы, если у вас несколько баз данных.Это также помогает предотвратить выбор неправильной базы данных во время выполнения, если это не указано.Сделайте SELECT email FROM main.users; вместо SELECT email FROM users;, даже если у вас есть только одна база данных.(main автоматически присваивается в качестве имени базы данных при вызове SQLConnection.open.)

Если вы случайно записали много изменений в базу данных (несколько операторов INSERT или UPDATE), тогдарассмотрите возможность обернуть его в транзакцию.Изменения будут внесены в память во время выполнения и затем записаны на диск.Если вы не используете транзакцию, каждая инструкция приведет к записи на диск в файл базы данных, что может быть медленным и занимать много времени.

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

НаконецКак отметил Benoit в своем комментарии, рассмотрите возможность улучшения ваших собственных запросов SQL и структуры таблиц, которые вы используете.Было бы полезно знать структуру вашей базы данных, и запросы являются фактической причиной низкой производительности или нет.Я предполагаю, что вы используете синхронное выполнение.Если вы переключитесь в асинхронный режим, вы увидите более высокую производительность, но это не значит, что на этом нужно останавливаться.

В онлайн-документации Adobe Flex содержится больше информации о повышении производительности базы данных и рекомендации по работе с локальными базами данных SQL .

0 голосов
/ 28 апреля 2011

Вы можете попробовать проиндексировать некоторые столбцы, используемые в предложении WHERE ваших операторов SELECT. Вы также можете попытаться свести к минимуму использование ключевого слова LIKE.

Если вы объединяете свои таблицы вместе, вы можете попытаться упростить связи между таблицами.

Как уже говорили другие, трудно конкретизировать, не зная больше о вашей схеме и используемом вами SQL.

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