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

 

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

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

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


Рис. 7.15. Типичное соединение вида «один к одному»
Необычные диаграммы соединений

219

Так как это внутреннее соединение, случаи соединения «один к нулю» между Tl и Т2 представляют собой скрытый фильтр соединения, который следует обрабатывать, как описано в конце главы 6. Также обратите внимание, что это может быть случай скрытого циклического соединения, что часто случается, когда главная таблица однозначно («один к одному») соединяется с другой таблицей. Если над Tl есть детальная таблица, что подразумевается окрашенной в серый цвет связью вверх, и если эта детальная таблица соединяется с Tl по тому же уникальному ключу, что и с Т2, то по закону транзитивности у вас есть подразумеваемое соединение от детальной таблицы к Т2. На рис. 7.16 подразумеваемая связь показана серым. О том, как обрабатывать циклические соединения, рассказывалось несколько раньше в этой главе.

D

Рис. 7.16. Подразумеваемая связь, создающая циклическое соединение

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

Точные соединения «один к одному»

На рис. 7.17 показан случай, требующий обязательного соединения двух таблиц в одну, когда это возможно. Здесь главные коэффициенты фильтрации равны в точности 1,0, и между таблицами существует точное отношение «один к одному». Таким образом, обе таблицы отображаются на один и тот же набор сущностей, и соединение — это всего лишь ненужные затраты по сравнению с использованием комбинированной таблицы.

Рис. 7.17. Точное соединение вида «один к одному»
220

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

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

Соединение вида «один к одному» с намного меньшим набором данных

На другом конце спектра находится случай, показанный на рис. 7.18, — соединение вида «один к нулю» или «один к одному», котороепрактически всегда работает как «один к нулю». Этот случай идеально оправдывает разделение таблиц. Для крошечного поднабора сущностей, представленного таблицей Т2, могут существовать другие требования оптимизации, отличные от требований для расширенного набора, представленного таблицей Tl. Вероятно, Tl обычно опрашивается без соединения с Т2, и в этих случаях исключение ненужных столбцов Т2 и поддержка только тех индексов, которые имеют смысл для общих сущностей, полезны. Здесь скрытый фильтр соединения, представленный низким главным коэффициентом соединения на стороне Т2 соединения отлично работает. Он настолько хорош, что вы даже можете начать выполнение запроса с не фильтрующегося полного сканирования таблицы Т2 и все так же найти наилучший путь к остальным данным. Если вы объедините эти таблицы в одну, то добиться подобного плана исполнения будет трудно, разве что за счет создания индексов, бесполезных для всех остальных случаев.

Риь 7.18. Соединение вида «один к нулю» или «один ко многим» между сильно различающимися по размеру таблицами

Здесь главная задача — не забыть учесть скрытый фильтр соединения от Tl к Т2, либо начиная запрос с Т2, либо обрабатывая ее как можно скорее, чтобы как можно раньше использовать скрытый фильтр.
Предыдущая << 1 .. 102 103 104 105 106 107 < 108 > 109 110 111 112 113 114 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100