Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Тоу Д. -> "Настройка SQL. Для профессионалов" -> 81

Настройка SQL. Для профессионалов - Тоу Д.

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 75 76 77 78 79 80 < 81 > 82 83 84 85 86 87 .. 161 >> Следующая


¦ Обращение к каждой таблице будет проходить через единственный индекс. Это будет индекс по полному условию фильтрации для первой таблицы и индекс по ключу соединения для всех остальных таблиц.

¦ Все таблицы будут соединяться при помощи вложенных циклов.

Позже я объясню, в каких случаях можно безопасно и выгодно ослабить требования надежности для соединений со вложенными циклами, но сейчас я хочу сконцентрироваться только на оставшемся вопросе для надежных планов — порядке соединения. Позже я расскажу, что делать, когда идеальный план выполнения нельзя получить, обычно из-за отсутствия индексов. Ho сейчас мы предполагаем, что ищем действительно оптимальный надежный план, не ограниченный отсутствующими индексами.

Обычный эвристический порядок соединения

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

1. Сначала обработать таблицу с наилучшим (ближайшим к нулю) коэффициентом фильтрации.

2. При помощи вложенных циклов — проходя через полные, уникальные индексы по первичным ключам — пройти как можно дальше, сначала обработав наилучший (ближайший к нулю) из оставшихся фильтров.

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

Сейчас эти шаги могут быть еще не очень понятны. He беспокойтесь. Далее в этой главе я подробно объясню каждый шаг. Эвристические методы обычно легче продемонстрировать, чем объяснить.

Если ведущая таблица оказалась на несколько уровней ниже верхней детальной таблицы (корневой таблицы, поскольку она находится в корне дерева), то вам потребуется возвращаться к шагу 2 после каждого перемещения вверх по дереву в шаге 3. Я описываю некоторые тонкости для редких специальных случаев, но в целом поиск оптимального плана очень прост, если у вас уже есть диаграмма запроса.

Настроив тысячи запросов из реальных приложений, включающих десятки тысяч подзапросов, я могу с уверенностью заявить, что эти правила сложны ровно
160

б. Выбор наилучшего плана выполнения

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

ПРИМЕЧАНИЕ--------------------------------------------------------------------

Позже в этой книге я рассмотрю эти редкие случаи и объясню, что с ними делать, но сначала надо как можно глубже уяснить базовые принципы.

Нужно знать одну тонкость, которая появляется, когда в шагах 2 и 3 упоминаются очередные связи вверх или вниз, обозначающие соединения. Таблицы, уже обработанные в плане, объединяются в один виртуальный узел, чтобы упростить выбор следующего шага плана. Наверное, будет проще отображать уже обработанные таблицы как объединение узлов в виде облака. Для оставшейся части плана совершенно неважно, как организованы уже обработанные таблицы или в каком порядке к ним обращались. Ответ на вопрос «Какая таблица идет следующей?» совершенно не зависит от порядка или метода, которые вы использовали при соединении предыдущих таблиц. Таблицы, находящиеся в объединении, определяют его границы и важны для плана, но как они туда попали — это, грубо говоря, уже история, которая не относится к очередному решению.

Когда вы составляете план выполнения, то можете обнаружить, что выбрали ведущей только что присоединенную таблицу. Это, конечно, ошибка. Если таблицы присоединяются к любому члену набора уже соединенных таблиц, то они совершенно одинаково могут присоединяться снизу или сверху облака. По мере прохождения шагов процесса можно даже рисовать расширяющиеся таблицы облака уже обработанных таблиц, чтобы четко видеть, какие таблицы лежат за его пределами. Отношения оставшихся таблиц с облаком четко указывают — присоединяются ли они к нему сверху или снизу, или даже вообще не присоединяются напрямую, потому что перед этим необходимо обработать присоединение других таблиц. Позже в этой главе я подробнее рассмотрю этот вопрос.

Простые примеры

Ничто не иллюстрирует метод лучше, чем примеры, поэтому я приведу пример, используя диаграммы запроса, построенные в главе 5, начиная с простейшего случая, двустороннего соединения, показанного на рис. 6.1.

EOJ

20

T 0.98

D05

Рис. 6.1. Простое двустороннее соединение

Применяя первый шаг метода, сначала спросим себя, какой узел предлагает наилучший (наименьший) эффективный коэффициент фильтрации. Это будет узел Е, так как коэффициент фильтрации для Е, равный 0,1, меньше коэффициента D,
Простые примеры

161

равного 0,5. Начиная с этого узла, выполним шаг 2 и обнаружим, что наилучшим (и единственным) узлом внизу будет узел D, поэтому перейдем к нему. Больше таблиц нет — следовательно, мы получили полный порядок соединения. Выполняя правила для надежного плана выполнения, к E мы будет обращаться при помощи индекса по его фильтру, ExemptJrI ад. Затем по вложенным циклам через индекс по первичному ключу DepartmentalD для Departments мы перейдем к соответствующим отделам. Применив грубую силу, в главе 5 я уже продемонстрировал, что этот план является наилучшим — по крайней мере, в терминах минимизации количества полученных строк.
Предыдущая << 1 .. 75 76 77 78 79 80 < 81 > 82 83 84 85 86 87 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100