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

1 ... 41 42 43 [ 44 ] 45 46 47 ... 107


Значения с А1 до А5 - это результаты, возвращенные запросами, поэтому выполните следующие математические действия.

Чтобы найти коэффициент фильтрации для узла Е, найдите значение А1/А2.

Чтобы найти коэффициент фильтрации для узла D, найдите значение АЗ/А4.

Чтобы найти детальный коэффициент соединения, найдите значение А5/А4, то есть количество возвращенных строк неотфильтрованного соединения разделите на количество строк, возвращенных из главной таблицы.

Чтобы найти главный коэффициент соединения, найдите значение А5/А2, то есть количество возвращенных строк неотфильтрованного соединения разделите на количество строк, возвращенных из детальной таблицы.

Например, в результате выполнения запросов Q1-Q5 получены значения 1 ООО, 10 ООО, 245, 490 и 9 800, соответственно. Получаются в точности коэффициенты фильтрации и соединения на рис. 5.1, и, если вы умножите все результаты вьшолнения запросов на одну и ту же константу, то получите те же коэффициенты.

Более сложный пример

Теперь я проиллюстрирую процесс диаграммного изображения для достаточно большого запроса. Я нарисую диаграмму для запроса в примере 5.2, в котором вы видите внешние соединения в старом стиле Oracle (если вы чувствуете себя уверенно, попробуйте нарисовать для этого запроса диаграмму самостоятельно).

Пример 5.2. Более сложный запрос с соединениями восьми таблиц

SELECT C.Phone Number, С.Honorific. C.F1rst Name. C.Last Name.

С.Suffix, C.AddressID. A.AddressID. A.Street Address L1nel, A,Street Address L1ne2. A,C1ty Name. A.State Abbrev1ation, A.ZIP Code, DD.Deferred Sh1pment Date, 00.Item Count. ODT.Text. ОТ.Text, P.Product Descript1on. S.Sh1pment Date FROM Orders 0. OrderDetails OD. Products P. Customers C, Shipments S.

Addresses A. Code Trans1at1ons ODT. Code Translations ОТ WHERE UPPER(C.Last Name) LIKE :LastjameЦS; AND UPPER(C.First Name) LIKE :First Name Г AND OD.Order ID = O.Order ID AND O.Customer ID = C.Customer ID AND OD.Product ID = P.Product ID(+) AND 0D.Sh1pment ID = S.Sh1pment ID(+) AND S.Address ID = A.Address ID(+) AND O.Status Code = ОТ.Code AND DT.Code Type = ORDERJTATUS AND OD.StatusJode = ODT.Code AND ODT.CodeJype = ORDERJETAILJTATUS AND O.Order Date > :Now - 366 ORDER BY C.Customer ID. O.Drder ID DESC. S.Sh1pment ID. DD.0rder Detai1 ID:

Как и раньше, следует игнорировать все части запроса кроме секций FROM и WHERE. У всех таблиц интуитивно понятные имена первичных ключей кроме Code Transl ati ons, первичный ключ которой состоит из двух частей: (Code Type. Code).

Обратите внимание, что, когда вы находите однотабличное условие равенства по части первичного ключа, как в запросе по Code Translat1ons, следует считать это условие частью условия соединения, а не фильтрации. Если вы обрабатываете однотабличное условие как часть соединения, то обычно рассматриваете фи-



зическую таблицу с двумя или несколькими логическими подтаблицами. Я называю их таблицами с яблоками и апельсинами . Чаще всего это физические таблицы, в которых хранятся в чем-то разные, но связанные между собой типы сущностей. Для оптимизации запроса на этих подтаблицах вас должна интересовать статистика по отдельной подтаблице, к которой обращается запрос. Поэтому выполните все запросы для статистики по таблице, добавив условие, указывающее интересующую вас подтаблицу, и не забудьте запрос для общего количества строк (SELECT COUNT(*) FROM <Таблицд>), который превращается в данном примере в запрос количества подходящих строк (SELECT COUNT(*) FROM Codejranslations WHERE Code Type= ORDER STATUS).

Если вы в качестве упражнения хотите заверщить скелет диаграммы запроса самостоятельно, выполните перечисленные ранее шаги по созданию диаграммы запроса вплоть до шага 4, и перейдите к рис. 5.4, чтобы посмотреть, все ли получилось правильно.

Изображение соединений к первой центральной таблице

Для вьшолнения первого шага поместите псевдоним О в центр диаграммы. Для шага 2 найдите все соединения с первичным 1слючом таблицы О, О. Order I D. Вы должны найти соединение от 00, которое представлено на рис. 5.2 как указывающая вниз стрелка от 0D к 0. Чтобы не забыть, что вы уже изобразили это соединение, вычеркните его из запроса.

Рис. 5.2. Начало диаграммы для примера 5.2

Изображение соединений от первой центральной таблицы

Переходя к шагу 3, найдите все внешние соединения (не к Order ID, а к внешним ключам) с Orders и добавьте их на диаграмму как стрелки, указывающие вниз от О к С и к ОТ, так как эти соединения используют первичные ключи Customers и Code Translations. Теперь диаграмма выглядит как на рис. 5.3.

С от

Рис. 5.3. Результат шага 3 для второй диаграммы



Смена центральной таблицы и повторение

На данный момент обработаны все соединения, которые исходят из таблицы с псевдонимом 0. Чтобы не забыть, какая часть работы уже завершена, перечеркните О во фразе FROM, и вычеркните соединения, уже изображенные на диаграмме связями. Шаг 4 указывает, что вам необходимо повторить шаги 2 и 3 с новой центральной таблицей, но в нем не говорится, как выбрать новую таблицу. Если вы будете поочередно выбирать центральной каждую таблицу на диаграмме, то завершите диаграмму правильно независимо от порядка, но можно сэкономить время, применив пару правил.

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

Используйте еще не нанесенные на диаграмму соединения для поиска новой центральной таблицы, для которой завершена еще не вся работа. Проверка списка еще не вычеркнутых соединений даст нам следующий список потенциальных кандидатов: 0D, Р, S, А и ODT. Однако из всего этого списка только 00 находится на диаграмме, поэтому это единственный узел, который можно выбрать центральным и расширить диаграмму. Если вы смогли заметить, что с таблицами С и ОТ больше не будет соединений, то следует вычеркнуть их из фразы FROM как не требующих дальнейшей обработки.

Выполняя эти правила, вы завершите диаграмму быстрее. Если на любом шаге вы обнаруживаете, что диаграмма слишком плотно скомпонована, то можете перерисовать ее, чтобы свободнее расположить элементы. Пространственная организация узлов используется только для удобства, она не несет никакого особого смысла. Например, я нарисовал С слева от ОТ, но вы можете поменять их местами, если это поможет вам лучше разместить элементы диаграммы.

ПРИМЕЧАНИЕ-

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

Итак, вы не нашли соединений с первичным ключом OrCler Details (то есть к OD.Orcler Detai 1 ID), поэтому все связи с 0D указывают вниз на Р, S и ODT, которые связаны с 0D при помощи своих первичных ключей. Так как S и Р являются дополнительными таблицами во внешних соединениях, посередине этих связей добавьте указывающие вниз острия стрелок. Вычеркните соединения от 0D, которые представлены этими тремя связями. Теперь осталось только одно соединение - внешнее соединение от S к первичному ключу А. Поэтому следует в последний раз выбрать новую центральную таблицу, на этот раз S, и добавить одну последнюю стрелку, указывающую вниз на А, с острием стрелки посередине, обозначающим это внешнее соединение. Вычеркните последнее соединение. Выбирать новую центральную таблицу не нужно, так как все соединения и псевдонимы уже на диаграмме.

ПРИМЕЧАНИЕ-

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



1 ... 41 42 43 [ 44 ] 45 46 47 ... 107

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