Физическая организация данных
Скачать 487.44 Kb.
|
Из множества возможных планов выполнения запроса оптимизатор в соответствии с критерием выбирает лучший план (рис. 7.3). В качестве критерия оптимизации может выступать: • Наилучшая общая производительность системы. Вообще говоря, её можно достичь, если из всех планов выбирать те, которые требуют меньше всего ресурсов (памяти и центрального процессора). Это позволит увеличить степень параллельности работы системы и повысить общую производительность, хотя при этом время выполнения отдельных запросов увеличится. Рис.7.3. Построение плана выполнения запроса в методе оптимизации по стоимости
Стоимость плана выполнения запроса определяется на основании сведений о распределении данных в таблицах, к которым обращается команда, и связанных с ними кластеров и индексов. Эти сведения о распределении значений данных называются статистикой и хранятся в словаре-справочнике данных. Для таблицы статистика может включать в се-бя:
Для каждого индекса статистика может содержать такие данные, как:
Распределение значений в столбце может быть отражено с помощью гистограммы, которая также входит в статистику. Для этого всё множество значений столбца упорядочивается и разбивается на N интервалов. На рис. 7.4 приведено разбиение на N =10 интервалов множества значений некоторого столбца F. Для равномерного распределения это означает, что в первых 10% записей это поле имеет значение от 1 до 10, в следующих 10% записей - от 11 до 20 и т.д.
Рис.7.4. Примеры равномерного (а) и неравномерного (б) распределения значений Г истограмма помогает оценить объём данных, удовлетворяющих усло-вию запроса. На рис. 7.4,б представлено неравномерное распределение дан-ных для некоторого столбца F. В словарь-справочник данных записываются полученные значения (1, 4, 4, 5, 6, 10, 11, 20, 35, 60, 100). При анализе запроса, например, с условием (F<=5) система сможет по этой гистограмме определить, что через индекс придётся выбрать не менее 30% записей таблицы. Гистограммы полезны только в тех случаях, когда они отражают актуальное распределение данных. Если распределение меняется при загрузке или модификации данных, гистограмму нужно обновлять. Построение гистограммы бесполезно в следующих случаях:
Существуют различные подходы к порядку сбора статистики. Неко-торые СУБД постоянно собирают статистическую информацию, но это может уменьшить быстродействие системы. Другие позволяют осуществлять сбор статистики периодически, например, в период минимальной загрузки системы. Третьи предлагают администратору специальные средства для сбора статистики, которые запускаются интерактивно по его команде. В последнем случае в обязанность администратора (администратора данных или приложений) входит выбор таблиц для анализа и периодическое обновление статистики данных.
Рассмотрим оптимизацию по синтаксису следующего запроса SQL: Пример 7.2. Запрос, выбирающих всех сотрудников по фамилии 'Иванов' с зарплатой менее 40000 рублей: SELECT * FROM Emp WHERE name LIKE 'Иванов%' AND salary<40000; Пусть таблица Emp имеет следующее правило целостности и индексы:
Возможны следующие пути доступа:
Индекс PK_TABNO недоступен, т.к. в запросе нет условий на значение поля tabNo. Оптимизатор выберет доступ по индексу с рангом 9. Теперь рассмотрим примеры оптимизации по стоимости. Пример 7.3. Запрос, выбирающий сотрудников с номерами больше 7500: SELECT * FROM Emp WHERE tabNo > 7500; Статистика для столбца tabNo, в частности, включает значения HIGH_VALUE и LOW_VALUE (максимальное и минимальное значения). Если нет гистограммы, то оптимизатор предполагает, что значения равно-мерно распределены в интервале [LOW_VALUE, HIGH_VALUE], и может определить процент значений, попадающий в интервал до 7500. Доступ будет осуществляться по индексу, если этот процент невысок, например, не более 10, хотя конкретное пороговое значение зависит и от других параметров, например, количества записей в блоке памяти. Пример 7.4. Запрос, выбирающий название отделов (name из таблицы De-part) и всех сотрудников с максимальной зарплатой в своём отделе (name, salary из таблицы Emp): SELECT d.name, e.name, salary FROM depart AS d, emp AS e WHERE d.depNo=e.depNo AND e.salary=(SELECT max(salary) FROM emp AS p WHERE p.depNo=e.depNo); Для таблиц есть индексы по первичным ключам (Depart.depNo и Emp.tabNo) и по внешнему ключу (Emp.depNo). Этот запрос можно выполнить по разным планам, например:
Расчёты здесь достаточно громоздкие, поэтому мы их приводить не будем, а ограничимся качественным анализом предложенных планов. Первый план от второго отличается способом соединения исходных таблиц. Но декартово произведение (т.е. полный просмотр одной таблицы для каждой строки другой таблицы) практически всегда выполняется дольше, чем соединение через индекс, когда не надо просматривать все отношение для поиска соответствия. Поэтому второй план предпочтительнее первого (за исключением случая маленьких таблиц, когда их размер сопоставим с размером индекса). Третий план от второго отличается предварительным вычислением подзапроса. Это позволит один раз построить агрегированные значения (по количеству отделов). А во втором запросе агрегированные значения будут строиться для каждого сотрудника. Т.е. чем больше сотрудников в одном отделе, тем больше выигрыш по времени в третьем запросе. Таким образом, при оптимизации по стоимости оптимизатор вероятнее всего выберет третий план как самый оптимальный с точки зрения времени выполнения запроса.
Цель настройки приложений - повышение эффективности работы с БД. В настройку приложений входит:
Первый пункт мы уже обсуждали (см. разделы 4.5.2). Настройка команд SQL, которые используются в приложениях к БД, - это один из основных способов повышения производительности системы. Эта настройка должна производиться каждым разработчиком программного обеспечения. Для оптимизации приложений необходимо иметь представление о порядке и механизмах реализации запросов в СУБД. Основные информационные потоки между пользователями, оперативной памятью и базой данных приведены на рис. 7.5. В ОП для каждого сеанса связи с БД выделяется специальная область - курсор, куда помещается результат выполнения последнего (текущего) запроса пользователя. Рис.7.5. Информационные потоки в БД Приведем основные рекомендации по написанию запросов, удобных для оптимизатора и эффективных при выполнении.
Например, для получения списка сотрудниц второго отдела при условии, что во втором отделе сотрудников около 5% от общего числа сотрудников, а женщин на предприятии - примерно половина, запрос должен выглядеть так: SELECT * FROM emp WHERE depNo=2 AND sex=^';
Например, список пациентов по отделениям №№1,2: SELECT * FROM patients p, depart d WHERE d.id IN (1,2) AND p.depNo=d.id;
Например, список всех хирургов: SELECT * FROM doctors WHERE special>'A' AND special like '%хирург%'; Здесь условие special>'A' не исключает из поиска ни одной записи таблицы, но позволяет системе проводить этот поиск по индексу, который занимает гораздо меньше памяти, чем сама таблица.
Например, запрос на выборку названия отделения №3: SELECT name FROM depart WHERE id*1=3; id - это первичный ключ, по нему есть индекс. Но при доступе через индекс потребуется минимум два обращения к диску. Включение индексированного поля в выражение (id*1 вместо id) подавляет использование индекса.
SELECT * FROM emp WHERE empNo in (SELECT empNo FROM children); Но для подзапросов, выдающих большой список, более оптимальным может оказаться вариант запроса с соединением (при наличии индекса по внешнему ключу): SELECT DISTINCT e.* FROM Emp AS e, Children AS с WHERE с.empNo=e.empNo; |