Программирование >>  Полное сканирование таблицы 

1 ... 63 64 65 [ 66 ] 67 68 69 ... 107



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

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

FROM ...Tl. ... Т2. ... ТЗ. ... WHERE ... Tl.FKeyl - Т2.РКеу2

AND Tl.FKey2 - T3.PKeyColumnl

AND T2.FKey3 - T3,PkeyColumn2 ...

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

Конкретный пример прояснит этот случай. Рассмотрим таблицы словаря данных: Tab! es. Indexes, Tab! e Col umns и Index Col umns. Для Tab! e Col umns можно выбрать состоящий из двух частей первичный ключ как (Table ID, Column Nuniber), где Col urin Nuriber обозначает место, которое столбец таблицы занимает в естественном порядке столбцов таблицы. Единица для первого столбца, двойка - для второго и так далее. Внещний 1слюч для таблицы Tables в таблице Indexes состоит из столбца Table ID. У таблицы Index Columns первичный ключ (Index ID. Columnjumber) тоже состоит из двух частей. Значение Col unin Nu(iiber в Index Columns имеет то же значение, что и Со1ишп КитЬег в Tab! е Со1 umns - место, которое столбец занимает в естественном порядке столбцов таблицы (но не его место в индексе, которое обозначается как Index Position). Если бы вы знали имя индекса и хотели бы узнать список имен столбцов, которые составляют индекс, в порядке, указанном Index Position, то написали бы такой запрос: SELECT TC.Column Name

FROM Indexes IndT Index Columns 1С. Table Colurnns TC WHERE Ind.Index Name - EMPLOYEESJl

AND Ind,Index ID - 1С,Index ID

AND Ind.TableJO - TC.TableJO

AND IC.Column Number - TC.Column Number ORDER BY 1С.Index Position ASC

ПРИМЕЧАНИЕ

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

Если коэффициент фильтрации условия по Index Name равен 0,0002, то диаграмма запроса без коэффициентов соединения выглядит как на рис. 7.7.

Здесь две ошибки (то есть два соединения, на концах которых нет полных первичных 1слючей) компенсируют друг друга, если рассматривать соединения с ТС



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


Ind 0.0002

Рис. 7.7. Конкретный пример для четвертого типа циклических соединений



Рис. 7.8. Комбинирование составных соединений от внешних ключей, распределенных по двум таблицам

Если вы выполните правило большого пальца, которое заставляет проводить соединение от полных первичных ключей (или к ним), то наилучший порядок соединения для рис. 7.7 станет очевидным. Начните с фильтра для Ind и перейдите по связи вверх к 1С. Только после этого, получив обе части первичного ключа для ТС, можно выполнять соединение с ТС. На самом деле это лучший план исполнения для этого примера. Правило большого пальца в таких случаях - следовать по этим необычным связям к составному первичному ключу после того, как база данных обработает все узлы наверху, необходимые для использования полного первичного ключа.

Резюме по циклическим соединениям

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

1. Две главные таблицы с отношениями один к одному разделяют одну и ту же детальную таблицу.

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

2. В главной и детальной таблицах хранятся копии внешнего ключа, который указывает на один и тот же первичный ключ третьей таблицы

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



денормализации, если только преимущества, полученные для этого или какого-либо другого запроса, не оправдывают денормализацию. В главе 10 вы узнаете, как оценить преимущества и недостатки денормализации.

ПРИМЕЧАНИЕ -

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

3. Двухузловой фильтр (не уникальный на обоих концах) уже сцеплен при помощи обычных соединений

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

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

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

Несвязные диаграммы запросов

На рис. 7.9 показано два случая несвязных диаграмм запросов. Это запросы, которые не объединяют все таблицы в одну связную структуру. В каждом из этих случаев вы видите два независимых запроса; для каждого из них существует отдельная диаграмма, которую можно оптимизировать независимо от другого запроса.

Случай Б Т1 Т2



Рис. 7.9. Несвязные диаграммы запросов

В случае А я демонстрирую запрос, состоящий из двух выглядящих независимыми запросов, в каждом из которых есть соединения. В случае Б я демонстрирую немного другой обычный запрос, одна из таблиц которого (таблица Т2) не связана с деревом соединения (то есть не связана ни с какой другой таблицей). Оба случая соответствуют двум независимым запросам, которые вьшолняются внутри одного. Что же происходит, когда вы сочетаете независимые, несвязные запросы в одном запросе? Когда две таблицы сочетаются в одном запросе без условий соединения, база данных возвращает декартово произведение - все возможные комбинации строк первой таблицы со строками второй таблицы. В случае несвязных диаграмм запросов считайте результаты запросов, представленных каждым независимым



1 ... 63 64 65 [ 66 ] 67 68 69 ... 107

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика