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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 125 126 127 128 129 130 < 131 > 132 133 134 135 136 137 .. 161 >> Следующая


Пример

Эти шаги требуют более глубокого рассмотрения. Чтобы применить шаги 1 и 2 к рис. 9.1, рассмотрим рис. 9.2.

Ч

С6

M

DA

,-Т\

і ч "Ч

\

_ D3 D4 D5 D6 D7

Рис. 9.2. Внутренняя диаграмма запроса для предыдущего запроса

Первоначальное сложное 22-стороннее соединение мы сократили до 6-стороннего соединения, показанного на внутренней диаграмме запроса черным цветом. Это простая задача оптимизации, для которой легко находится лучший порядок внутренних соединений (СЗ. Dl, ВЗ. Al. М. АЗ).

Теперь перейдем к шагу 3. Ведущая таблица — это СЗ, поэтому поднабор s_0 содержит все нормальные присоединяемые внешне таблицы, доступные через соединения вниз от СЗ. Это набор {D2. D3}. Первое соединение вверх — это соединение с ВЗ, поэтому s_l состоит из {С2, С4} — набора узлов (исключая узлы из поднабора s_0), достижимых через соединения вниз от ВЗ. Второе соединение вверх проводится с Al, поэтому s_2 выглядит как {BI. В2, Cl}. Последнее соединение вверх — это соединение с М, поэтому в s_3 содержатся все остальные нормальные присоединяемые внешне таблицы: {А2, В4. В5. С5. Сб. D4. D5. D6. D7}. На рис. 9.3 показано, как присоединяемые внешне таблицы разделены на поднаборы.
Внешние соединения

267

Теперь перейдем к шагу 4. Так как нам нужны только сравнительные (или относительные) текущие количества строк, пусть начальное количество строк в СЗ будет любым числом, на основе которого можно будет выбрать удобное круглое значение г_0, например, 10. Начиная с этого значения, найдем список значений для г_п.

г_0:10 — выбрано произвольно, лишь для упрощения подсчетов.

г_1: 6 (г_0 х 3 х 0,2) — числа 3 и 0,2 — это детальный коэффициент соедине-

ния для соединения с ВЗ и произведение всех коэффициентов фильтрации, собранных до следующего соединения вверх. Также нужно было бы скорректировать количества строк в зависимости от главных коэффициентов соединения, меньших 1,0, если бы такие существовали, но в нашем примере только обычные главные коэффициенты соединения, равные 1,0. Так как под ВЗ нет фильтрованных узлов, которые обрабатываются после соединения с ВЗ, единственный значимый фильтр — это фильтр для ВЗ, коэффициент фильтрации которого равен 0,2.

г_2: 120 (г_1 х 50 х 0,4) — числа 50 и 0,4 это детальный коэффициент соеди-

нения для соединения с Al и произведение всех коэффициентов фильтрации, собранных до следующего соединения вверх. Так как ниже Al нет фильтрованных узлов, которые обрабатываются после соединения с Al, единственный значимый фильтр — это фильтр для Al, коэффициент фильтрации которого равен 0,4.

г_3:36 (г_2 х 2 х 0,15) — числа 2 и 0,15 являются детальными коэффициентами

соединения для связи с M и произведением всех оставшихся коэффициентов фильтрации. Так как после соединения с M обрабатывается один фильтрованный узел АЗ, то произведением всех оставшихся коэффициентов фильтрации является произведение коэффициента фильтрации для M (0,5) и коэффициента фильтрации для АЗ (0,3): 0,5 х 0,3 = 0,15.
268

9. Особые случаи

Наконец, выполним шаг 5. Минимальным из всех относительных значений количества строк является г_1, поэтому наборы s_0 и s_l, которые можно соединять до того, как запрос обработает Al, должны быть присоединены в этой точке порядка соединения перед соединением с Al. Следующее минимальное значение — это г_3, поэтому поднаборы s_2 и s_3 нужно присоединить в конце порядка соединения. Единственное дополнительное ограничение — поднаборы должны присоединяться сверху вниз, чтобы таблицы внизу обрабатывались, следуя дереву соединения. Например, Cl нельзя присоединить до соединения с В2; a D7 — до соединения с В5 и Сб. Так как я пометил главные таблицы по уровням, D ниже С, С ниже В, а В ниже А, вы можете составить соединения сверху вниз, просто отсортировав каждый набор в алфавитном порядке. Например, полный порядок соединения, отвечающий всем требованиям, будет выглядеть как (СЗ. Dl. ВЗ. {D2, D3}. {С2. С4}, Al. М. АЗ. {BI. В2. Cl}. {А2. В4. В5. С5. Сб. D4, D5. D6. D7}). Фигурные скобки в данном случае обозначают поднаборы.

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

Стандартный надежный план, построенный на основе эвристических правил из главы 6, начинает с 0 и при помощи вложенных циклов переходит к индексу по внешнему ключу OD, который указывает на 0. После перехода к таблице OD база данных отбрасывает 99,5 % строк, так как они не проходят через очень селективный фильтр для 0D. Затем база данных переходит к S по индексу по ее первичному ключу и отбрасывает 70 % оставшихся строк, считав таблицу S, так как они не отвечают условиям фильтра для S. В целом это неплохой план выполнения, и он может быть достаточно быстрым, если количество строк в OD мало, а требования к производительности невысоки.
Предыдущая << 1 .. 125 126 127 128 129 130 < 131 > 132 133 134 135 136 137 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100