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

 

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

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

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


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

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

Порядок 8-стороннего соединения

Пока что все идет неплохо, но двусторонние соединения слишком просты, чтобы изучать новый метод, поэтому перейдем к следующему примеру, 8-стороннему соединению. Теоретически для восьми таблиц можно придумать 8! порядков соединения (то есть 40 320 вариантов) — достаточно для того, чтобы воспользоваться систематическим методом. Рисунок 6.2 повторяет задачу из главы 5.

OD

Рис. 6.2. Типичное 8-стороннее соединение

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

1. Найдем таблицу с наименьшим коэффициентом фильтрации. В этом случае это С с коэффициентом 0,0002, поэтому С становится ведущей таблицей.

2. Из С невозможно перейти вниз к какой-либо таблице через индекс по первичному ключу. Поэтому следует перейти по диаграмме вверх.

3. Единственный путь из С ведет к 0, поэтому таблица 0 присоединяется второй.

4. После обработки 0 мы обнаруживаем, что теперь можно перейти вниз к ОТ. Когда возможно, всегда выбирайте путь вниз, и переходите вверх, только в случае, когда путей вниз не осталось. Таблица ОТ присоединяется третьей.
162

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

5. Ниже ОТ нет никаких таблиц, поэтому мы возвращаемся к 0 и переходим вверх к таблице OD, которая присоединяется четвертой.

6. Все оставшиеся соединения ведут вниз и не фильтруются, поэтому соединения с S, P и ODT можно выполнять в любом порядке.

7. Соединение с А можно выполнить в любой момент, HO только после соединения с S, которое открывает путь к таблице А.

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

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

Таким образом, мы обнаружили, что оптимальный порядок соединения можно описать как С; 0; ОТ; 0D; S, P и ODT в любом порядке, а также А в любой момент после S. То есть допустимыми являются 12 одинаково хороших порядков соединения из 40 320 возможных. Изматывающий поиск всех возможных порядков соединения подтверждает, что эти 12 одинаково хороши. Их лучше всего использовать для минимизации количества полученных строк в надежных планах выполнения.

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

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

ODT

А CF ОТ

Рис. 6.3. Полностью упрощенная диаграмма запроса для того же 8-стороннего соединения

Я вернусь к этому примеру позже и покажу, что этот результат можно немногс улучшить, ослабив требования для полностью надежного плана выполнения и ис-
Простые примеры

163

пользуя соединение хэшированием, но сейчас я хочу сфокусироваться на том, чтобы научить вас мастерству оптимизации для наилучшего надежного плана. Мы уже нашли 12 наилучших порядков соединения, и мне необходим один из них для дальнейшего рассмотрения и завершения решения этой задачи. Я выбираю порядок соединения (С. 0. ОТ. 0D. 0DT. P. S. А).

Окончательное решение для 8-стороннего соединения

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