Современные объемы хранимых данных, обязательные требования к их доступности и скорости обработки, динамика развития систем обуславливают важность исследования факторов, влияющих на качество баз данных, лежащих в основе современных информационных систем.
На этапе эксплуатации вопрос производительности считается одним из главных, поскольку, если не обеспечивается требуемое время реакции системы, то система не выполняет возложенных на нее функций.
С точки зрения функционирования распределенной системы, одним из главных критериев является время отклика при обращении к базе данных. Время отклика складывается из продолжительности следующих процессов: доставка запроса; обработка запроса и поиск необходимой информации; доставка результатов запроса клиенту. Для минимизации данного показателя необходимо комплексное исследование всех подсистем, реализующих эти функции. Таким образом, целью магистерской работы является исследование характеристик распределенной системы, в частности, сервера InterBase, которое позволит выявить возможные пути оптимизации приложений баз данных.
Здесь приводится ряд выводов относительно разработки эффективных приложений, сделанных в ходе изучения работ некоторых специалистов в области баз данных.
Прежде чем приступать к оптимизации приложения баз данных, необходимо выявить узкие места в системе и уже затем оптимизировать именно их. Если приложение еще не создано, то о его оптимизации следует задуматься уже на этапе разработки, так в дальнейшем исправить ошибки будет сложнее. Далее перечисляются аспекты, влияющие на производительность работы приложения:
4.1. Минимизация объемов данных, передаваемых по сети.
Прежде всего следует запрашивать меньше данных (не использовать оператор '*' в запросах на выборку, перечислять поля явно; продумать пользовательский интерфейс так, чтобы не было необходимости возвращать пользователю все записи таблицы, предоставив ему средства для поиска; предпочтительно выполнять объединение таблиц (операторы WHERE, JOIN) вместо lookup-полей).
4.2. Выполнение подготовки запросов (метод Prepare()).
4.3. Отказ от использования вложенных подзапросов [4].
4.4. Отказ от использования итераций по наборам данных.
Работа в многопользовательской среде делает сложным подсчет записей, поэтому желательно не использовать свойство RecordCount и агрегатную функцию SQL COUNT. Также следует избегать итераций по результирующему набору, поскольку это означает пересылку большого объема данных между клиентом и сервером. Процесс значительно ускорится, если эти операции выполнять на сервере.
5.1. Определение уровней изоляции.
Следует разделить все запросы на группы и для каждой группы использовать транзакции с определенными параметрами (уровнем изоляции, режимом доступа). Например, для запросов на чтение самых последних изменений в базе данных установить уровень изоляции транзакции read committed, а для запросов на чтение данных для построения отчета - уровень изоляции snapshot [5]. Установление транзакции в режим только для чтения (Read-Only) позволяет указать цель использования транзакции, в некоторых случаях это позволяет серверу провести внутреннюю оптимизацию.
5.2. Рациональное завершение транзакций.
Существует два способа завершения транзакций: подтверждение (Commit) и откат (Rollback). Откат следует делать только тогда, когда это действительно необходимо, в остальных случаях – подтверждать, так как количество откатов учитывается сервером для определения момента времени очистки базы данных. Транзакции с долгим временем жизни способны значительно повысить загрузку сервера, следовательно, при планировании проекта следует обращать внимание на то, чтобы транзакция не оставалась активной дольше, чем существует запрос (поэтому нужно с осторожностью использовать одну транзакцию для нескольких запросов). Нежелательно использовать Commit/Rollback Retaining, так как они не завершают транзакцию. Транзакции предпочтительнее завершать, даже если их немедленно придется перезапустить, так как это уменьшает время жизни транзакции.
5.3. Очистка базы данных (сборка мусора).
Существует несколько способов решения проблем с производительностью, связанных со сборкой мусора: во-первых, запретить автоматическую очистку базы данных и запускать ее вручную в период наименьшей загруженности сервера [5], во-вторых, использовать транзакции в режиме read committed вместо snapshot и, по возможности, избегать откатов.
Были проведены эксперименты (тест вставки и тест удаления), целью которых было установить каким образом индексы влияют на скорость выполнения запросов вставки и удаления записей (INSERT, DELETE) в базе данных InterBase.
Здесь приводится только общая идея алгоритма, без подробностей реализации, и анализ полученных результатов.
Тест вставки записей состоит в следующем: в таблицу, содержащую определенное количество записей (возможно, пустую) вставляется некоторое количество записей, время выполнения этого запроса засекается и сохраняется. При этом запрос на вставку записей выполняется для таблицы с индексированными полями, так и с неиндексированными. Таким образом, можно оценить влияние индексов на время выполнения запроса типа INSERT. Описание алгоритма см. рис. 1.
Открыть тестируемую базу данных;
Примечание: ACount – количество вставляемых записей |
Тест удаления записей выполняется аналогично тесту вставки, только с учетом особенностей многоверсионной архитектуры InterBase. Описание алгоритма см. рис. 2.
{определение времени выполнения запроса SELECT}
|
Тесты вставки записей:
Результаты тестов изображены в виде диаграммы. На оси Х отложено количество записей в таблице до вставки, по оси У – время выполнения запроса на вставку.
В пустую таблицу последовательно добавляются записи по 50 тысяч, пока число записей в таблице не достигнет 1 млн. 250 тысяч. В таблице нет активных индексов. |
|
В пустую таблицу последовательно добавляются записи по 100 тысяч, пока число записей в таблице не достигнет 1 млн. 300 тысяч. В таблице нет активных индексов. |
|
В пустую таблицу последовательно добавляются записи по 200 тысяч, пока число записей в таблице не достигнет 1 млн. 400 тысяч. В таблице нет активных индексов. |
|
В пустую таблицу последовательно добавляются записи по 50 тысяч, пока число записей в таблице не достигнет 1 млн. 250 тысяч. В таблице есть активные индексы. |
|
В пустую таблицу последовательно добавляются записи по 100 тысяч, пока число записей в таблице не достигнет 1 млн. 300 тысяч. В таблице есть активные индексы. |
|
В пустую таблицу последовательно добавляются записи по 200 тысяч, пока число записей в таблице не достигнет 1 млн. 400 тысяч. В таблице есть активные индексы. |
Тесты удаления записей:
Следует обратить внимание на важную особенность архитектуры сервера InterBase при выполнении теста удаления записей. Дело в том, что транзакция, выполняющая запрос на удаление (DELETE …) не производит фактического удаления записей, это связано с многоверсионной архитектурой, реализованной в InterBase, поэтому и время выполнения запроса DELETE будет мало. Реальное же удаление записей производит уже другая транзакция, которая обращается к записям после выполнения запроса DELETE. Поэтому при вычислении времени, затрачиваемого на удаление записей, следует это учитывать.
Таким образом, время, потраченное на удаление записей, складывается из времени выполнения запроса DELETE (при этом удаляемые записи просто помечаются как удаленные) и времени, потраченном запросом SELECT (который выполняется сразу после предыдущего запроса) на сборку мусора.
Был проведен ряд тестов в таблице, содержащей от 500 тысяч записей до 1 млн. 200 тысяч.
Для таблицы, не содержащей индексированные поля, было установлено время удаления от 7 до 12 секунд.
Для таблицы с индексированными полями это время составило от 14 до 18 секунд.
Тест вставки:
Тесты показали, что если таблица не индексированная, то время вставки мало (в среднем: 30 с - для вставки 50 тысяч записей, 55 с – для вставки 100 тысяч записей, 2 мин. – для вставки 200 тысяч записей), причем это время не зависит от степени заполненности таблицы, в которую записи добавляются.
В случае, если таблица имеет поля с индексами, то время вставки существенно увеличивается, к тому же оно увеличивается пропорционально заполненности таблицы, куда производится вставка.
Таким образом, можно сделать вывод, что наличие индексов замедляет процесс вставки. Конечно, пользователю это будет заметно, если вставляется много записей. Поэтому при необходимости вставки большого числа записей (порядка несколько сот тысяч) рекомендуется временно удалять индексы (затем их можно заново создать с помощью запроса CREATE INDEX).
Тест удаления:
Тесты показали, что удаление записей в таблице с индексами занимает больше времени, чем в неиндексированной таблице. Поэтому можно дать ту же рекомендацию, что и при вставке записей: временно отключать индексы. К тому же сразу же после удаления большого числа записей следует выполнять запрос на чтение или backup/restore, производя, таким образом сборку мусора, чтобы запрос пользователя, который будет обращаться к записям, не выполнялся слишком долго.
В результате изучения существующих исследований по теме магистерской работы был сделан ряд выводов, касающихся разработки эффективных приложений баз данных.
В ходе проведения собственных исследований было установлено, что индексация в базах данных InterBase оказывает существенное воздействие на производительность системы. Оба теста показали, что наличие в таблице индексированных полей существенно замедляет выполнение запросов, поэтому их временно следует отключать. Результаты теста удаления позволили также получить практические подтверждения многоверсионности в InterBase. Это в очередной раз подтверждает то, что при работе с базой данных, при выполнении запросов следует внимательно относиться к особенностям архитектуры сервера и учитывать их при работе с базами данных.
При написании данного автореферата магистерская работа еще не завершена. Окончательное завершение: январь 2007. Полный текст работы и все материалы по теме могут быть получены у автора или его руководителя после указанной даты.