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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 66 67 68 69 70 71 < 72 > 73 74 75 76 77 78 .. 161 >> Следующая


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

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

5. Заполнив все узлы и связи, впишите числа для коэффициентов фильтрации и коэффициентов соединения, основываясь, если возможно, на статистике по таблицам для промышленного приложения. Если у вас нет промышленных данных, то постарайтесь угадать как можно точнее. Нет необходимости добавлять коэффициенты соединения рядом со связями, представляющими внешние CO-
Полные диаграммы запросов

141

единения. Практически всегда для дополнительной таблицы внешнего соединения (на стороне со знаком (+) соединения, в старой записи Oracle, или в новом стиле — сразу за ключевыми словами LEFT OUTER) условия фильтрации не указаны, поэтому коэффициент фильтрации равен 1,0, что обозначается просто фактом отсутствия числа на диаграмме.

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

ОБЕСПЕЧЕНИЕ УНИКАЛЬНОСТИ ---------------------------------------------------------

Иногда условие фильтрации настолько близко к гарантированному уникальному соответствию, что хочется считать его уникальным. Обычно это можно делать без опаски, но я обнаружил, что полезно сначала попытаться сделать уникальность полной, добавив несколько отсутствующих условий или исправив дизайн базы данных. Например, у вас может быть фильтр 0rder_ID=: 1 для таблицы Orders, и первичный ключ для Orders, состоящий из столбцов 0rder_ID и Company_ID, причем у Company_ID единственное, доминирующее значение встречается в 99,9 % случаев. Наиболее вероятная причина, почему разработчик не указал никаких условий для Company_ID, — он просто забыл, что иногда этот столбец принимает значение, не равное доминантному, и что 0rder_ID отдельно не всегда указывает на уникальный заказ. Я обнаружил, что, когда условия фильтрации близки к уникальным, то практически всегда разработчик хотел сделать их уникальными, и следует добавить отсутствующее условие или условия, чтобы добиться запланированной функциональности.

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

Если у вас есть настоящие данные, использующиеся для работы приложения, то они являются идеальным источником коэффициентов фильтрации и соединения. Для примера 5.1, чтобы точно определить зти коэффициенты, нужно выполнить следующие запросы (от Ql до Q5):

Ql: SELECT C0UNT(*) Al FROM Employees WHERE Exempt FIag=1Y':

Al: 1000

Q2: SELECT C0UNT(*) A2 FROM Employees;

A2: 10000

Q3: SELECT C0UNT(*) A3 FROM Departments WHERE USJasecLFlag=1Y':

A3: 245

Q4: SELECT C0UNT(*) A4 FROM Departments:

A4: 490

Q5: SELECT COUNTC*) A5 FROM Employees E1 Departments D WHERE E.Department_ID=D.Department_ID:

A5: 9800
142

5. Диаграммное изображение простых запросов SQL

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

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

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

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

¦ Чтобы найти главный коэффициент соединения, найдите значение А5/А2, то есть количество возвращенных строк неотфильтрованного соединения разделите на количество строк, возвращенных из детальной таблицы.
Предыдущая << 1 .. 66 67 68 69 70 71 < 72 > 73 74 75 76 77 78 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100