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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 83 84 85 86 87 88 < 89 > 90 91 92 93 94 95 .. 161 >> Следующая


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

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

С использованием декартова произведения стоимость плана составит лишь 1002, если за функцию стоимости принять количество считанных строк.

Что же произойдет, если размеры таблиц удвоятся? Стоимость исходного плана, следующего связям для соединений, удвоится, составив 4002, что пропорционально количеству возвращенных запросом строк, которое также удваивается. Это нормально для надежных планов, стоимость которых пропорциональна количеству возвращенных строк. Однако план с декартовым произведением резко ухудшается: база данных считает 2 строки из Tl, затем для каждой из этих строк считает по 2 строки из Т2 (всего 4 строки), и затем, с декартовым произведением, состоящим из 4 строк, считает 4000 строк из М. Стоимость запроса, 4006, теперь практически равна стоимости обычного плана. Еще раз удвоив размеры таблиц, мы получим, что стоимость стандартного плана становится равной 8004, а плана с декартовым произведением — 16 020. Это демонстрирует ненадежность большинства планов выполнения с декартовым произведением, которые
178

6. Выбор наилучшего плана выполнения

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

Ho иногда можно использовать декартовы произведения без опасений за ухудшение производительности, получая неожиданные преимущества. Вполне безопасно можно создавать декартовы произведения любого количества наборов, возвращающих гарантированно одну строку, получая недорогой, однострочный результат. Можно даже комбинировать однострочный набор с многострочным, и результат будет не хуже, чем если бы вы считали этот многострочный набор из ведущей таблицы отдельно. Основное преимущество надежных планов — тщательное исключение планов выполнения, которые сочетают несколько многострочных наборов. Вспомните, что в главе 5 правила требовали поместить звездочку рядом с уникальными условиями фильтрации (условиями, гарантированно пропускающими максимум одну строку). С тех пор я не использовал эти звездочки, но сейчас они снова выходят на сцену.

Рассмотрим рис. 6.15. Обратите внимание, что на нем есть два уникальных фильтра, для В2 и СЗ. Начиная с единственной строки из СЗ, которой соответствует уникальное условие фильтрации, вы можете быть уверены, что из Dl и D2 будет присоединено по одной строке через их первичные ключи (см. указывающие вниз стрелки к Dl и D2). Изолируйте эту ветвь, считая ее отдельным однострочным запросом. Теперь получите единственную строку из В2, которая удовлетворяет уникальному условию фильтрации, и объедините два независимых запроса декартовым произведением, чтобы получить комбинированный набор из одной строки.

Поместив эти однострочные запросы на первое место, вы получите начальный порядок соединения (СЗ. Dl. D2. В2) (или (В2, СЗ. Dl. D2), без разницы). Если вы будете считать первые запросы, выдающие однострочный результат, независимой операцией, то обнаружите, что для таблиц Al и ВЗ получатся новые условия фильтрации, так как до того, как выполнить оставшуюся часть запроса, вы уже будете знать значения внешних ключей, указывающих на В2 и СЗ. Измененный запрос теперь выглядит как на рис. 6.16, на котором уже выполненные однострочные запросы помещены в серое облако, обозначающее границы уже считанного фрагмента запроса.

Указывающие вверх стрелки обозначают, что начальное условие фильтрации для Al комбинируется с новым условием фильтрации по внешнему ключу, указывающему на В2, что дает общую селективность 0,06. He фильтрованный ранее узел ВЗ получает из условия по внешнему ключу, указывающему на СЗ, коэффициент фильтрации 0,01.
Сложный пример

179

M

Ж T >4.

Al 0.3 А2 0.1 АЗ 0.001

BI 0.6 В2 0.2* ВЗ В4 0.5 В5

Cl С2 0.9 СЗ 0.01* С40.8 С5 0.2 Сб

D1 D2

Рис. 6.15. Запрос с уникальными условиями фильтрации M

ж T ж

Al 0.3x0.2 А20.1 АЗ 0.001

Рис. 6.16. Запрос с уникальными условиями фильтрации, с заранее считанными ветвями
Предыдущая << 1 .. 83 84 85 86 87 88 < 89 > 90 91 92 93 94 95 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100