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

 

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

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

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

Необычные диаграммы соединений

211

скелетом запроса (или изолированным узлом), отдельной виртуальной таблицей. С этой точки зрения база данных возвратит все комбинации строк из двух независимых запросов. То есть вы получите декартово произведение.

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

¦ В запросе отсутствует соединение между не связанными частями. В этом случае необходимо просто добавить отсутствующее соединение.

Запрос объединяет два независимых запроса, каждый из которых возвращает несколько строк. Здесь избежать появления декартова произведения можно, выполнив независимые запросы по отдельности.

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

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

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

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

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

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

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

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

Если один из независимых запросов гарантированно возвращает единственную строку, то декартово произведение будет, по крайней мере, безопасным и гарантированно вернет не больше строк, чем второй независимый запрос. Однако при комбинировании запросов потенциально существует и небольшая стоимость работы при получении данных через сетевое соединение с сервером, так как список выбора комбинированного запроса может возвращать данные из небольшого запроса несколько раз по одному для каждой строки, возвращаемой большим запросом. А это требует пересылки большего количества байт, чем при использовании разъединенных запросов. Эти затраты пропускной способности определенным образом противопоставляются экономии времени ожидания сети. Комбинированный запрос экономит повторные обращения к базе данных по сети, поэтому выбор зависит от деталей запроса. Если вы не разъедините запросы, то оптимальный план прост. Сначала необходимо выполнить оптимальный план для запроса, возвращающего одну строку. Затем, при помощи вложенного цикла, который выполняется всего один раз, выполнить оптимальный план для запроса, возвращающего несколько строк. Этот комбинированный план исполнения стоит столько же, сколько и выполнение двух запросов независимо. Если же вместо этого вы выполните план для запроса, возвращающего несколько строк, первым, то план со вложенным циклами потребует повторного выполнения плана для запроса, возвращающего одну строку, — по одному разу для каждой строки, возвращенной другим запросом.
Предыдущая << 1 .. 98 99 100 101 102 103 < 104 > 105 106 107 108 109 110 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100