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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 142 143 144 145 146 147 < 148 > 149 150 151 152 153 154 .. 161 >> Следующая


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

Лучше использовать преимущества скрытых фильтров соединения, указывающих на Cl и Dl как можно раньше в плане исполнения. Следовательно, стоит сделать явными фильтры вида «не равен null» по внешним ключам (в BI и С2), указывающим на эти фильтрующие соединения, как показано на рис. А.8. Если сделать эти фильтры явными, сами соединения больше не будут выполнять фильтрующую функцию, поэтому нужно вычеркнуть эти коэффициенты соединения.

Начиная с СЗ, соединение можно выполнить только с ВЗ, поэтому ставим это соединение следующим в создаваемом порядке выполнения запроса. Теперь можно соединить с С2, С4 и С5 (вниз) или с А2 (вверх). В обычной ситуации вы выбрали бы только какое-то из соединений с таблицами из нижней части диаграммы. Ho следует обратить внимание, что детальный коэффициент соединения с А2 равен 1,0, поэтому это соединение можно выполнять достаточно рано в порядке выполнения запроса. На самом деле, оказывается, что у него лучший эффективный фильтр среди всех возможных соединений, поэтому выполняем соединение с А2. Теперь в список допустимых узлов попадает узел М, но детальный коэффициент соединения с M слишком большой, поэтому используем это соединение как можно позже. Теперь единственный допустимый узел внизу, имеющий фильтр — это С2, благодаря ставшему теперь явным условию «не null» по внешнему ключу, указывающему на Dl, следовательно, следующим присоединяем узел С2. Теперь порядок соединения — (СЗ. ВЗ. А2, С2).
Решение для задачи из главы 6

303

M 0.5

Рис. А.8. Корректировка по превращению условия типа «не равен null» по внешним ключам в явные, чтобы оптимизировать остаток порядка соединения

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

Выбирая между С4 и С5, мы также сталкиваемся с одинаковыми коэффициентами фильтрации, равными 1,0, поэтому решаем проблему при помощи правила близости фильтров, которое благоприятствует узлу С4, так как он открывает доступ к фильтру для D3. После обработки С4 переходим к D3, чтобы использовать его фильтр,

и, наконец, присоединяем не фильтрованный узел С5. Теперь порядок соединения — (СЗ. ВЗ. А2. С2. D2. Dl. С4. D3. С5).

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

Приложение А. Решения задач

выбираем Cl. Таким образом, сначала присоединяем Cl, а полный порядок соединения выглядит как (СЗ, ВЗ, А2. С2. D2, Dl. С4. D3, С5, И. Al. BI. Cl. В2).

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

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

Чтобы достичь корневой детальной таблицы из СЗ, используя надежный план со вложенными циклами, базе данных потребуются индексы по внешним ключам (от M к А2, от А2 к ВЗ и от ВЗ к СЗ) для М, А2 и ВЗ. Вероятно, вам не потребуется индекс для СЗ, так как 20 % фильтр для этой таблицы недостаточно селективен, чтобы предпочесть индексный доступ полному сканированию таблицы. Чтобы обеспечить надежный план, для всех остальных таблиц требуются индексы по их первичным ключам.
Предыдущая << 1 .. 142 143 144 145 146 147 < 148 > 149 150 151 152 153 154 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100