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

 

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

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

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


Комбинирование запроса, возвращающего одну строку, с запросом, возвращающим несколько записей, иногда и удобно, и оправданно. Существует специальный случай, соответствующий правой части рис. 7.9, когда запрос, возвращающий одну строку — это просто считывание одной строки из изолированной таблицы Т2, для которой вообще нет соединений. Декартово произведение иногда полезно для выбора параметров, хранящихся в однострочной таблице параметров. Особенно когда эти данные упоминаются только в разделе WHERE, а не в списке SELECT. Если запрос не возвращает данные из таблицы параметров, то дешевле выполнить правильно скомбинированный запрос, чем отдельные запросы.

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

Диаграммы запросов с несколькими корневыми узлами

На рис. 7.10 показан пример диаграммы запроса, нарушающей предположение о наличии одного корневого узла у дерева запроса. Этот случай сродни предыдущему случаю (несвязные диаграммы запросов). Здесь для каждой строки таблицы Master, удовлетворяющей условию запроса, запрос вернет все комбинации соответствующих детальных строк из Rootl и Root2. С данными детальными коэффициентами соединения можно ожидать, что все комбинации 5 детализированных строк
Необычные диаграммы соединений

213

из Root 1 и 30 строк из таблицы Root2 дадут 150 комбинированных строк для каждой соответствующей строки из Master. Эти 150 строк содержат не больше исходных данных, что 5 строк из Rootl и 30 строк из Root2 вместе, поэтому будет быстрее считать 5 и 30 строк по отдельности, избежав декартова произведения. Тогда как несвязные диаграммы запросов генерируют одно большое декартово произведение, несколько корневых узлов приводят к появлению целых наборов небольших декартовых произведений, по одному для каждой соответствующей главной строки.

Rootl Root2

Рис. 7.10. Диаграмма запроса с несколькими корнями

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

1. Отсутствующее условие. В этом запросе отсутствует условие, которое преобразовало бы одну из корневых детальных таблиц в главную таблицу, превратив соединение «один ко многим» в «один к одному».

Решение: добавить отсутствующее условие соединения.

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

Решение: избавьтесь от декартова произведения, разделив запрос на независимые запросы, которые считывают две корневые детальные таблицы по отдельности.

3. Детальный коэффициент соединения меньше 1,0. В этом случае одна из корневых детальных таблиц соединяется с общей главной таблицей с детальным коэффициентом соединения, меньшим 1,0.

Решение: хотя этот случай не создает проблем для производительности, рассмотрите вариант разъединения частей запроса или превращения одной из частей запроса в подзапрос, по функциональным причинам.

4. Tаблица используется только для проверки существования каких-либо сущностей. Одна из корневых детальных таблиц не поставляет никаких данных, нужных в списке SELECT, и включена только для проверки существования. Решение: превратите проверку существования в явный подзапрос.
214

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

Случай 1. Отсутствующее условие соединения

Чаще всего присутствие второго корневого узла указывает на некоторое отсутствующее условие соединения, которое превратило бы один из корневых узлов в главный узел. На рис. 7.11 показано это преобразование, когда соединение от Master к Rootl превращается в соединение «один к одному» путем добавления некоторого дополнительного условия для Rootl (переименованного в Rl), которое гарантирует, что база данных найдет для каждой строки из Master максимум одну строку в Rl. Это особенно вероятно, когда в Rl хранятся некоторые детализированные данные, зависящие от интервалов времени (например, различные налоговые ставки), соответствующие главной записи (например, налоговой сущности), а добавление условия по дате (например, запрос текущей налоговой ставки) превращает соединение в «один к одному».

Часто условие, превращающее соединение в «один к одному», уже присутствует, и вы обнаруживаете, что комбинация соединения вида «многие к одному» и обманчивого фильтра просто отменяет детальный коэффициент фильтрации.
Предыдущая << 1 .. 99 100 101 102 103 104 < 105 > 106 107 108 109 110 111 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100