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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 96 97 98 99 100 101 < 102 > 103 104 105 106 107 108 .. 161 >> Следующая


(Tl. Т2. ТЗ)

(Tl. ТЗ. Т2)

(Т2. Tl. ТЗ)

(ТЗ. Tl. Т2)

Любой другой порядок (например, (Т2. ТЗ. Tl)), после обработки второй таблицы создал бы ужасающее сочетание строк вида «многие ко многим», практически декартово произведение строк из Т2 и ТЗ. Все перечисленные ранее порядки соединения обрабатывают Tl первой или второй, перед тем, как обработать обе таблицы Т2 и ТЗ. Таким образом, эти порядки соединения выполняют только два обычных соединения «многие к одному» между детальной таблицей Tl и ее главными таблицами Т2 и ТЗ.

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

На рис. 7.5 показан специфический пример с двухузловым фильтром, в котором доля строк из обычных соединений от Tl к Т2 и ТЗ, удовлетворяющих условию
Необычные диаграммы соединений

207

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

Tl 0.01

Т2—0.2—ТЗ 0.5 Т4 0.3

T

Т5 04

Рис. 7.5. Двухузловой фильтр с явным двухузловым коэффициентом фильтрации

Следуйте обычной процедуре, чтобы настроить диаграмму на рис. 7.5, игнорируя двухузловой фильтр между Т2 и ТЗ, пока не достигнете одной из этих таблиц. Ведущая таблица — Tl, за ней Т4 — таблица под Tl с наилучшим обычным фильтром. Далее у ТЗ лучший обычный фильтр с коэффициентом фильтрации 0,5, поэтому она помещается в порядок соединения следующей. Теперь необходимо выбрать между Т2 и Т5, но для Т2 активирован двухузловой фильтр, поскольку ТЗ уже обработана, что дает ей более эффективный коэффициент фильтрации (0,2), чем у Т5, поэтому присоединяем Т2 следующей. Итоговый лучший порядок соединения (Tl. Т4. ТЗ. Т2. Т5).

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

Соединение с Т2 в предыдущем примере — это обычное соединение, которое выполняется методом вложенных циклов от внешнего ключа, указывающего вниз из Tl, к индексу по первичному ключу Т2. Избегайте вложенных циклов для таблицы, с которой связан двухузловой фильтр. Возвращаясь обратно к SQL-коду перед рис. 7.5, можно заметить, что гораздо выгоднее обратиться к таблице Customers методом вложенных циклов, выполняя соединение Tl.Customer_ID = T2.Customer_ID, чем условия двухузлового фильтра T2.Region_ID! = T3.Region_ID.

Случай 4. Составное соединение от двух внешних ключей к составному первичному ключу разложено на две таблицы

Наконец, на рис. 7.6 представлен четвертый из основных случаев циклических соединений. Здесь присутствуют два необычных соединения с ТЗ, и ни в одном из них не используются ни полный первичный ключ этой таблицы, ни первичные ключи таблиц на противоположных концах соединений. Если такие случаи, когда не удается произвести соединение с полным первичным ключом хотя бы на одной стороне соединения, это ошибки, то случай 4 — это случай, когда две ошибки компенсируют друг друга.
208

7. Диаграммное изображение и настройка сложных SQL-запросов

Рис. 7.6. Циклическое соединение с двумя необычными соединениями

В ситуации, показанной на рис. 7.6, SQL обычно выглядит следующим образом: SELECT ...

FROM ...Tl. ... Т2. ... ТЗ. ...

WHERE ... Tl.FKeyl - Т2.РКеу2 AND Tl.FKey2 - ТЗ.PKeyColumnl AND T2.FKey3 - ТЗ.PkeyColumn2 ...

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

Конкретный пример прояснит этот случай. Рассмотрим таблицы словаря данных: Tables, Indexes, Tabl e_Col umns и Index_Col umns. Для Tabl e_Col umns можно выбрать состоящий из двух частей первичный ключ как (Table_ID, Column_Number), где Col umn_Number обозначает место, которое столбец таблицы занимает в естественном порядке столбцов таблицы. Единица для первого столбца, двойка — для второго и так далее. Внешний ключ для таблицы Tables в таблице Indexes состоит из столбца Tab! e_ID. У таблицы Index_Columns первичный ключ (Index_ID. ColumnJIumber) тоже состоит из двух частей. Значение Col umn_Number в Index_Columns имеет то же значение, что и Column_Number в Tabl e_Col umns — место, которое столбец занимает в естественном порядке столбцов таблицы (но не его место в индексе, которое обозначается как Index_Position). Если бы вы знали имя индекса и хотели бы узнать список имен столбцов, которые составляют индекс, в порядке, указанном Index_Position, то написали бы такой запрос:
Предыдущая << 1 .. 96 97 98 99 100 101 < 102 > 103 104 105 106 107 108 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100