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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 88 89 90 91 92 93 < 94 > 95 96 97 98 99 100 .. 161 >> Следующая


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

Можно ожидать, что программное обеспечения базы данных самостоятельно умеет понимать, что внутреннее соединение подразумевает условие «не null» для внешнего ключа, который может принимать значение null. Базы данных могут автоматически применять это предполагаемое условие при первой же возможности, но я никогда не видел, чтобы они это делали.
Сложный пример

189

В следующих примерах предположите, что главный коэффициент соединения, меньший 1,0, возникает только из-за иногда равных null внешних ключей, а не из-за сбоев в ссылочной целостности. Выберите ведущую таблицу, выполняя правила в этом разделе. Если ведущая таблица соединяется с дополнительной главной таблицей сверху, явно укажите условие «не null» в запросе и поместите селективность этого условия в коэффициент фильтрации детального узла. Рассмотрим диаграмму SQL на рис. 6.26.

M 0.1

Рис. 6.26. Запрос с фильтрующим главным соединением

Сначала посмотрим: влияет ли главный коэффициент фильтрации на выбор ведущей таблицы? Обе стороны соединения от Al к BI получают преимущество от этого скрытого фильтра соединения, и у Al лучше начальный коэффициент фильтрации. Узлы, присоединенные к BI снизу, также получили бы преимущество, HO под BI нет узлов. Ни у одного другого узла нет конкурирующего коэффициента фильтрации, поэтому начнем с Al, как если бы скрытого фильтра не было. Чтобы получить максимальное преимущество от такого начала, явно укажите условие «не null» для внешнего ключа Al, который указывает на BI, добавив следующий оператор:

Al.ForeignKeyToBl IS NOT NULL

Это явное добавление оператора в SQL-код позволяет базе данных выполнить первое соединение с другой таблицей, используя только долю, равную 0,01 х 0,1 = = 0,001 строк из Al. Если в фильтре ведущего индекса участвует столбец ForeignKeyToBl, база данных может вообще не считывать ненужные строки из Al. Что же присоединять дальше? Так как база данных уже использовала скрытый фильтр (теперь не скрытый) в явном условии Al. ForeignKeyToBl IS NOT NULL, то этот фильтр «сгорел», поэтому сравнивайте BI с В2, как если бы фильтрующего соединения вообще не было.

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

В действительности после применения условия «не null» фильтрующего соединения больше не существует. Строки, с которых база данных начинает до выполнения этих соединений, успешно присоединяются к BI, поскольку строки с внешними ключами, равными null, уже отброшены.

Сравнивая BI и В2 по их простым коэффициентам фильтрации, сначала выберите В2, получив в итоге порядок соединения (Al. В2. BI. М. А2. ВЗ).

Теперь рассмотрите диаграмму на рис. 6.27 и попробуйте обработать ее самостоятельно перед тем, как читать дальше.

И снова фильтрующее соединение не оказывает никакого влияния на выбор ведущей таблицы, так как коэффициент фильтрации для M намного лучше даже
190

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

откорректированных коэффициентов фильтрации для Al и BI. Что присоединять дальше? Если вы проводите соединение с не фильтрованной стороны фильтрующего главного соединения, сделайте скрытый фильтр явным, указав условие «не null» для ForeignKeyToBl. Когда вы превращаете этот фильтр в явный, то у соединения оставшихся строк эффективный коэффициент соединения становится равным всего лишь 1,0, как у большинства главных соединений. Исправленная диаграмма SQL показана на рис. 6.28.

M 0.001

BI 0.8 В20.2 ВЗ

Рис. 6.27. Еще один запрос с фильтрующим главным соединением

M 0.001

BI 0.8 В2 0.2 ВЗ

Рис. 6.28. Исправление диаграммы, для установки явного фильтра главного соединения

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

Теперь рассмотрите более сложную задачу на рис. 6.29 и попытайтесь решить ее самостоятельно перед тем, как продолжать чтение.

Рассматривая в первую очередь наилучший эффективный фильтр, скорректируйте коэффициент фильтрации для Al и коэффициенты фильтрации ниже фильтрующего главного соединения. Теперь для Cl эффективный фильтр равен 0,1 х 0,02 = = 0,002. Можно было бы сделать этот фильтр явным для Al, как в предыдущих примерах, указав условие «не null» для внешнего ключа, указывающего на В2, но это не смогло бы добавить Al достаточно селективности, чтобы сделать его лучше Cl. Прочие варианты — это не прошедшие корректировку коэффициенты для других узлов. Лучший из них — 0,005 для М. Этот коэффициент не настолько хорош, как эффективный ведущий фильтр для С2, поэтому ведущей таблицей выбираем
Сложный пример

191

С2. Теперь фильтрующее главное соединение уже не имеет значения, поскольку база данных не будет выполнять соединения в этом направлении, и полный порядок соединения становится (Cl. В2, Al BI. М. А2, ВЗ).
Предыдущая << 1 .. 88 89 90 91 92 93 < 94 > 95 96 97 98 99 100 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100