Использование методов оптимизации запросов к распределенной базе данных для повышения эффективности информационных систем
Т. А. Федосеенко
Московский технологический институт
e-mail: velliar@gmail.com
Аннотация.Статья посвящена решению задачи повышения эффектив-ности распределенных баз данных. Для увеличения производительности выполнения запросов необходимо искать решения, анализируя процесс выполнения запросов сервером — заменять запросы с выборкой без по-вторений, использовать индексы, оптимизировать структуру базы дан-ных на этапе физического проектирования.
1. Введение
Оптимизация является одним из важных направлений разработок в области ис-следований баз данных (БД). Согласно Джону Бэнтли, под оптимизацией понима-ется модификация системы для улучшения ее эффективности [1]. Хорошо оптими-зированная БД значительно снижает нагрузку на сервер, и увеличивает общую производительность [3, 4].
В статье рассматривается информационная система, реализованная на основе СУБД Access, обладающей следующими достоинствами: БД способна обеспечить достаточную производительность при работе с системой порядка сотни пользова-телей с единой базой данных на сервере; обладает невысокой стоимостью; имеет интуитивно понятный и простой способ установки на клиентские компьютеры; имеет в составе средства, позволяющие обеспечить формирование третьей нор-мальной формы объектов реляционной базы данных; обеспечивает поддержку рус-ском языке и интегрирована с продуктами Microsoft Office.
2. Постановка задачи
Рассматриваемая база данных, логическая структура которой представлена на рис. 1, представляет собой базу данных, приведенную к третьей нормальной форме.
Рисунок 1. Структура БД
То, что БД находятся в третьей нормальной форме, подразумевает, что они находятся и в первой и второй нормальной форме [4, 5]. Согласно первой нормаль-ной форме в БД значения столбцов являются атомарными и все записи — уникаль-ны. Отношения находятся во второй нормальной форме и каждый их неключевой атрибут неприводимо зависим от первичного ключа. В третьей нормальной форме отсутствуют транзитивные функциональные зависимости неключевых атрибутов от ключевых, т. е. все неключевые атрибуты зависят только от первичного ключа.
В нормализованной базе данных уменьшается вероятность возникновения ошибок, уменьшается противоречивость хранимой в базе данных информации.
Эффективность системы может оцениваться различными критериями. Про-блема оптимизации запросов базы данных составляется из трех основных компо-нентов [6, 7]:
− оптимизация запросов;
− оптимизация структуры;
− оптимизация сервера.
3. Повышение эффективности на основе анализа запросов
Критерии, определяющие степень эффективности запроса, формируются на основании основных характеристик системы. Применительно к исследуемой ин-формационной системы, с учетом области применения выделим следующие крите-рии:
− длительность выполнения запросов выборки;
− нагруженность сервера в зависимости от количества запросов в едини-цу времени;
− длительность выполнения обновления и изменения данных
С учетом специфики системы этих критериев достаточно для оценки эффек-тивности выполнения запросов в системе.
Проанализируем таблицу «Заявки». Будем выполнять простой запрос на вы-борку всех данных из таблицы «Заявки», меняя общее количество записей в ней. В результате будем фиксировать время выполнения запросов.
Полученные результаты сведены в гистограмму, изображенную на рис. 2. Из диаграммы видно, что при увеличении количества записей в таблице увеличивается и скорость увеличения длительности загрузки.
Рисунок 2. Гистограмма результатов анализа длительности выполнения простых запросов выборки из таблицы с разным числом записей
Проанализируем длительность выполнения запроса на выборку одной записи (при выборке с условием на уникальный идентификатор). Сначала используем для анализа две записи, одна из которых находится условно в начале таблицы, то есть имеет небольшое значение уникального идентификатора и была добавлена одной из самых первых и записи, которая находится в конце и была добавлена одной из последних. Как видно по результатам, время выборки примерно одинаково и неве-лико. При этом отбор производится по ключевым индексированным полям.
Проверим результат при выборке по этим же записям, но сделав поля, по кото-рым производится отбор, неключевыми и не индексированными. Как видно, время выполнения запросов увеличилось, т. е. использование индексов существенно вли-яет на производительность выполнения запросов. Проведем аналогичный анализ на строковых данных, осуществив выборку сначала по индексированным полям, затем по полям, не имеющим индексов.
По данным таблицы можно сделать вывод о том, что в случае, если по какому-либо полю часто выполняется выборка, то для обеспечения необходимой произво-дительности нужно создавать для этого поля индексы. Это ускорит поиск в базе данных и длительность выборки.
Степень влияния индексов на производительность в рассмотренном при-мере отображена на диаграмме на рис. 3
Рисунок 3. Степень влияния наличия индексов на длительность выборки данных из таблицы «Заявки».
Предположим, что необходимо осуществить выборку из заявок всех подразде-лений, для которых какие-либо заявки были созданы. В этом случае можно вос-пользоваться запросом
select
п.Наименование
from
Заявка з,
Подразделение п
where
п.ИД = з.ИД_Подразделение
Однако в этом случае мы получим дубликаты наименований подразделений, так как заявки для них могли создаваться неоднократно. Поэтому для исключения повторений наименований используем distinct.
select distinct
п.Наименование
from
Заявка з,
Подразделение п
where п.ИД = з.ИД_Подразделение
Длительность выполнения запроса составляет 0,187 с, что достаточно велико при выборке всего двух записей из базы данных. Попробуем оптимизировать за-прос. Прежде всего, проанализируем процесс выполнения запроса на сервере баз данных.
Изначально происходит выборка из двух таблиц: Заявка и Подразделение. За-прос c условием «where» сервер баз данных преобразует в запрос, содержащий «join» — операцию соединения таблиц, которая является подмножеством декартова произведения таблиц. Декартово произведение n таблиц — это таблица, содержа-щая все возможные строки r, такие, что r является сцеплением какой-либо строки из первой таблицы, строки из второй таблицы, ... и строки из n-й таблицы. Таким образом, на первом этапе сервером выполняется декартово произведение таблиц Заявка и Подразделение. Затем происходит выборка данных по условиям. И только на следующем этапе уже после выполнения выборки происходит ее просмотр и ис-ключение дубликатов. Очевидно, что узким местом тут является выборка лишних записей, которые отсеиваются лишь на последнем этапе. Следовательно, нужно изменить синтаксис запроса так, чтобы сначала происходила выборка подразделе-ний сразу без учета тех, для которых не созданы заявки. Это можно сделать с по-мощью ключевого слова exists.
select п.Наименование
from Подразделение п
where exists(
select 1
from Заявка з
where з.ИД_Подразделение = п.ИД)
Измененный запрос будет выглядеть так (оптимизированный запрос). Время выполнения этого запроса составляет всего 0,015 с. Таким образом, заменив запрос с distinct аналогичным запросом с «exists», мы добились уменьшения длительности получения результатов более чем в 12 раз за счет анализа последовательности вы-полнения запроса на сервере.
Для достижения оптимальной структуры базы данных необходимо соблюдать нормализацию, по возможности на этапе физического проектирования подбирать для атрибутов типы данных, занимающие минимум объема памяти, предпочти-тельнее выбирать числовые типы вместо строковых и бинарных. Согласно справке MySQL, разработанного компанией Oracle, выделяются следующие типы оптими-зации структуры базы данных [8]:
1. Оптимизация объемов данных. Она заключается в уменьшении объемов данных, хранимых на диске для представления таблиц. Чем меньше занимает таб-лица в памяти, тем быстрее происходит работа с базой данных.
2. Оптимизация типов данных. Заключается в устранении избыточности раз-меров типов данных.
При разработке системы выработаны следующие правила выбора типов дан-ных:
1. Тип числовых данных необходимо устанавливать исходя из предполагаемого максимально возможного содержимого данных. В случае, если есть возможность заменить иные типы на числовой без потери смысловой и структурной целостно-сти — следует сделать это.
2. Для строкового типа данных необходимо всегда стараться задавать мини-мальный размер. Не следует все время указывать максимально возможный, в слу-чае, если содержимое не до конца известно, лучше запросить уточнение проектных материалов.
3. Бинарные типы данных следует применять лишь в редких случаях, в осо-бенности для хранения длинных строк следует тщательно изучить возможности хранения данных в строках фиксированного размера вместо использования бинар-ных типов.
4. Выводы
Для достижения максимальной производительности выполнения запросов необходимо искать более эффективные решения, анализируя процесс выполнения запросов сервером. К примеру, по возможности заменять запросы с выборкой без повторений (с использованием ключевого слова «distinct») запросами с использо-ванием включения «exists». Также использовать индексы для тех полей, по кото-рым идет частый отбор, например, для ключевых полей.
Литература
[1] Bentley J. Writing Efficient Programs. —Prentice Hall Ptr, 1982
[2] Pluzhnik E. V., Nikulchev E. V. Use of dynamical systems modeling to hybrid cloud database // International Journal of Communications, Network and System Sciences. 2013. Vol. 6. No. 12. С. 505–512.
[3] Плужник Е. В., Никульчев Е. В. Слабоструктурированные базы данных в ги-бридной облачной инфраструктуре // Современные проблемы науки и образо-вания. 2013. № 4. С. 95.
[4] Введение в базы данных [Электронный ресурс] . — Режим доступа: http://www.codenet.ru/progr/vbasic/vb_db/1.php
[5] Кириллов В. В. Основы проектирования реляционных баз данных. Учебное по-собие. — СПб. : ИТМО, 1994.
[6] Matthias Jarke, Jurgen Koch. Query Optimization in Database Systems // Computing Surveys, Vol. 16, No. 2, 1984.
[7] Israel M., Jones J. S., Jones S. MCSE: SQL Server 2000 Design Study Guide (Exam 70-229) .— Sybex, 2001
[8] Optimizing Database Structure [Электронный ресурс] . — Режим доступа: http://dev.mysql.com/doc/refman/5.5/en/optimizing-database-structure.html.