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

 

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

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

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


В частности, если на диаграмме запроса я нахожу неотфильтрованные листовые узлы, то подозреваю, что соединение должно быть внешним. Целые ветви деревьев соединения часто должны быть связаны внешними соединениями с остальной диаграммой запроса, если в этих ветвях отсутствуют фильтры. Как я уже упоминал в главе 7, фильтрованные узлы обычно исключают внешний случай внешнего соединения. Явно делая эти фактически внутренние соединения внутренними, вы увеличиваете количество степеней свободы в порядке соединения, что позволяет оптимизатору получить лучший план выполнения. Внутренние соединения с узлами без фильтров также могут выполнять скрытую фильтрующую роль, если главный коэффициент соединения с этими узлами хотя бы немного меньше 1,0. Если такой фильтрующий эффект функционально необходим, то внутреннее соединение необходимо. Однако намного более вероятно, что такой фильтрующий эффект — последняя вещь, о которой думал разработчик во время написания SQL. Скорее всего фильтрующий эффект внутреннего соединения с узлом без фильтров — это нежелательная случайность.

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

Al 0.4 А2 АЗ 0.3

BI В2 ВЗ 0.2 В4 В5

Рис. 9.1. Запрос с 16 неотфильтрованными внешними соединениями
Внешние соединения

265

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

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

Шаги порядка оптимизации нормального внешнего соединения

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

1. Изолируйте часть диаграммы соединения, в которой нет нормальных внешних соединений. Назовем ее внутренней диаграммой запроса.

2. Оптимизируйте внутреннюю диаграмму запроса, не учитывая нормальные внешние соединения.

3. Разделите узлы, присоединяемые внешне в нормальных внешних соединениях, на поднаборы согласно тому, на каком уровне они прикреплены к внутренней диаграмме запроса. Назовем поднабор, прикрепленный к ведущей таблице или под ней, s_0. Набор, к которому можно перейти только через одно соединение вверх от ведущей таблицы, — s_l. Набор, к которому можно перейти только через два соединения вверх от ведущей таблицы, — s_2, и так далее.

4. Подсчитайте относительное текущее количество строк для каждой точки в порядке соединения перед следующим соединением вверх и для конечной точки порядка соединения.

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

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

Назовем относительное текущее количество строк перед первым соединением вверх г_0; относительное текущее количество строк перед вторым соединени-
266

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

ем вверх г_1; и так далее. Назовем конечное относительное количество строк

r_j, где j — количество соединений вверх от ведущей таблицы к корневой детальной таблице.

5. Среди всех поднаборов s_n найдите минимальное значение г_ш (так, чтобы ш > п) и присоедините все узлы в этом поднаборе сверху вниз в точке порядка соединения, где относительное количество строк равно этому минимальному значению. Присоедините последний поднабор, прикрепленный внизу к корневой детальной таблице, в конце порядка соединения после всех внутренних соединений, так как это единственный допустимый минимум для этого под-набора.
Предыдущая << 1 .. 124 125 126 127 128 129 < 130 > 131 132 133 134 135 136 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100