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

 

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

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

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


Если к С5 снизу были бы присоединены один или несколько узлов, теперь их следовало бы сравнить с С4, но так как внизу узлов нет, шаг 2 предлагает нам единственный выбор — С4. Расширив границы облака, чтобы захватить С4, мы видим, что под ним больше нет узлов, поэтому переходим к шагу 3, находим единствен-
Простые примеры

165

ный узел А2, присоединяющийся к облаку сверху, и добавляем его в строящийся порядок соединения, который теперь выглядит как (В4. С5. С4. А2). Облако вокруг уже соединенных таблиц выглядит как на рис. 6.6.

M

В5 0.7

С8 0.9

Рис. 6.4. Сложное 17-стороннее соединение M

Рис. 6.5. Облако уже соединенных таблиц, включающее две таблицы

Обратите внимание, что я закрасил исходное облако с двумя узлами другим оттенком серого. На практике вам не нужно стирать предыдущие облака, просто изображайте новые облака вокруг старых. Возвращаясь к шаіу 2, найдем ниже текущего облака соединенных таблиц единственный узел, ВЗ, и поместим его следующим в по-
166

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

рядок соединения, не обращая внимания на коэффициент фильтрации, который мог бы быть указан. Расширьте границы облака, включив ВЗ. Теперь шаг 2 надо выполнить на узлах С2 и СЗ. Следующим в порядке соединения выбираем С2, так как его коэффициент фильтрации, 0,5, лучше, чем подразумеваемый коэффициент 1,0 для не фильтрованной таблицы СЗ. Теперь порядок соединения (В4. С5. С4, А2. ВЗ. С2). Расширьте облако, включив С2. Новых узлов под облаком не появилось, поэтому шаг 2 выполняется только для узла СЗ. Tеперь порядок соединения будет (В4. С5. С4. А2, ВЗ. С2. СЗ), и рис. 6.7 иллюстрирует текущее облако соединения.

M

Рис. 6.6. Облако уже соединенных таблиц, включающее четыре таблицы

M

Рис. 6.7. Облако уже соединенных таблиц, включающее семь таблиц
Простые примеры

167

Теперь для шага 2 у нас есть два новых узла под облаком соединения, Dl и D2, причем коэффициент фильтрации у Dl лучше. Так как к этим узлам никакие другие узлы снизу не присоединены, присоединим их последовательно в зависимости от коэффициентов фильтрации и перейдем к шагу 3, имея порядок соединения (В4. С5. С4. А2. ВЗ. С2. СЗ. Dl. D2). Вся ветвь ниже А2 обработана и осталась только связь вверх к M (это главная таблица запроса), поэтому мы переходим к этому узлу. Так как мы достигли главной таблицы в корне дерева соединения, для оставшейся части задачи шаг 3 нам не понадобится. Применяйте шаг 2, пока не вставите в порядок соединения остальные таблицы. Сразу же под M (и под всем облаком) находятся Al и АЗ, причем фильтр есть только у Al, поэтому присоединяем таблицу Al. Теперь порядок соединения (В4, С5. С4. А2. ВЗ. С2, СЗ. Dl. D2. М. Al), а на рис. 6.8 показано текущее облако соединения.

Рис. 6.8. Облако уже соединенных таблиц, включающее одиннадцать таблиц

Сразу же под облаком находятся узлы BI, В2 и АЗ, но ни для одного из них нет фильтра, поэтому проверим фильтры следующего шага. Такие фильтры можно найти для Cl и В5, но фильтр Cl лучше, поэтому добавляем BI и Cl к текущему порядку соединения. Теперь порядок соединения (В4, С5. С4. А2. ВЗ. С2, СЗ. Dl. D2. М. Al. BI. Cl). Все так же у нас нет лучшего выбора, чем оставшийся фильтр следующего шага для В5, поэтому присоединяем АЗ и В5 в указанном порядке. Теперь осталось только два узла, В2 и Сб, и оба можно сразу же присоединить, так как они напрямую присоединены к облаку. Выберем Сб первым, так как его коэффициент фильтрации равен 0,9, и это значение лучше, чем подразумеваемый коэффициент 1,0 для не фильтрованного соединения с В2. Полный порядок соединения будет следующим — (В4. С5, С4. А2. ВЗ. С2. СЗ. Dl, D2. М. Al. BI. Cl. АЗ. В5. Сб. В2).

Кроме порядка соединения правила указывают, что база данных должна обращаться к таблице В4 через индекс для его условий фильтрации, а ко всем ос-
168

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

тальным таблицам база данных должна обращаться при помощи вложенных циклов по индексам по их ключам соединения. Эти индексные ключи соединения — первичные ключи для соединений вниз с С5, С4, ВЗ, С2, СЗ, Dl, D2, Al, BI, Cl, АЗ, В5, Сб и В2 и внешние ключи для А2 (указывающий на В4) и M (указывающий на А2). Все вместе, это полностью описывает единственный оптимальный план из 17!, то есть 355 687 428 096 ООО возможных порядков соединения и всех возможных методов соединения и индексов. Однако этот пример все же имеет два слабых места.

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

¦ Последняя часть порядка соединения не сильно влияет на время выполнения, если первая часть порядка составлена правильно и все таблицы обрабатываются через их ключи соединения. В этом примере, как только база данных достигнет узла М, и, возможно, Al по правильному пути, путь к оставшимся таблицам повлияет на время выполнения лишь незначительно. В большинстве запросов даже меньшая доля таблиц действительно важна для порядка соединения, поэтому вы получите прекрасный план, лишь правильно выбрав ведущую таблицу и выполняя для остальных таблиц вложенные циклы по ключам соединения в любом порядке, допустимом в дереве.
Предыдущая << 1 .. 78 79 80 81 82 83 < 84 > 85 86 87 88 89 90 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100