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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 143 144 145 146 147 148 < 149 > 150 151 152 153 154 155 .. 161 >> Следующая


Чтобы сделать скрытые фильтры соединений с Cl и Dl явными и использовать их как можно раньше в плане исполнения, добавьте в запрос условия С2. FkeyToDl IS NOT NULL AND BI. FkeyToCl IS NOT NULL.

Теперь ослабьте требования надежного плана и подумайте, какие соединения должны проводиться методом хэширования и какой путь доступа нужно использовать для таблиц, соединяемых хэшированием. Вспомните, что в таблице Al 30 ООО ООО строк. Исходя из детальных коэффициентов соединения, в BI и В2 должно быть в 300 раз меньше строк. То есть в обеих таблицах находится по 100 000 записей. Исходя из комбинации главного коэффициента соединения и детального коэффициента соединения, в Cl в десять раз меньше строк, чем в BI, — 10 000. Переходя вверх от Al к М, видим, что в M в 0,02 раза меньше строк, чем в Al, — 600 000. Спускаясь вниз от M и используя детальные коэффициенты соединения, вычислим, что в А2 и ВЗ по 60 000 строк, в С2 30 000 строк, в СЗ 10 000 строк, в С4 20 000 строк и в С5 12 000 строк. Учитывая главный и детальный коэффициенты соединения от С2 к Dl, вычислим, что в Dl 6 000 (30 000 х 0,4/2) строк. Исходя из детальных коэффициентов соединения, найдем, что в D2 150 строк, а в D3 2 000 строк.

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

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

Как обсуждалось в главе 2, фактически порог для индексного доступа может находиться в любой точке между 0,5 и 20 %, но в этом упражнении граничным значением считается 5 %, чтобы сделать задачу конкретнее.

Итак, в таблице А.1 показаны размеры таблиц и граничные значения для выбора полного сканирования таблицы, отсортированные в порядке соединения.
Решение для задачи из главы 6

305

Таблица А.1. Размеры таблиц и пороги для выбора полного сканирования таблицы для решения упражнения из главы 6

Таблица Количество строк Граничное значение для выбора полного сканирования таблицы
СЗ 10 ООО 500
ВЗ 60 000 3 000
А2 60 000 3 000
Cl 30 000 1500
D2 150 8
Dl 6 000 300
С4 20 000 1000
D3 2 000 100
С5 12 000 600
M 600 000 30 000
Al 30 000 000 1 500 000
BI 100 000 5 000
Cl 10 000 500
В2 100 000 5 000

Теперь, узнав количество строк на каждом шаге запроса, мы обнаруживаем, что после полного сканирования таблицы СЗ фильтр для СЗ сокращает количество строк до 2000. Соединение вверх методом вложенных циклов с BI затрагивает 12 ООО строк из этой таблицы, так как детальный коэффициент фильтрации равен 6. Для ВЗ нет фильтра, поэтому следующее соединение вида «один к одному» (в среднем) с А2 также затрагивает 12 ООО строк, после чего фильтр для А2 оставляет лишь 30 % (3600 строк) для следующего соединения с С2. Имея главный коэффициент соединения, равный 1.0, вложенные циклы затронут 3600 строк из С2. Фильтры для С2 (включая ставший явным фильтр «не равен null» по внешнему ключу к Dl) сокращают количество строк до 1440 перед соединением с D2. Вложенные циклы для D2 считывают 1440 строк из этой таблицы, после чего фильтр оставляет 1008 строк. Вложенные циклы для Dl считывают 1008 строк из этой таблицы (так как на данный момент у всех строк есть не равные null внешние ключи, указывающие на Dl), после чего фильтр оставляет 706 строк (я округляю это значение, что буду делать и в дальнейшем).

Вложенные циклы для С4 считывают 706 строк из этой таблицы, и они не фильтруются, оставляя количество строк равным 706. Вложенные циклы для D3 считывают 706 строк из этой таблицы, после чего фильтр оставляет 282. Вложенные циклы для С5 считывают 282 строки из этой таблицы, и они не фильтруются, оставляя количество строк равным 282. С детальным коэффициентом соединения равным 10, соединение вверх с M считывает 2820 строк из этой таблицы, после чего фильтр оставляет только 1410. С не указанным главным коэффициентом соединения равным 1,0, вложенные циклы считывают 1410 строк из самой большой таблицы, Al, и после этого фильтр оставляет 564 строки. Вложенные циклы для BI считывают 564 строки из этой таблицы, после чего фильтры (включая ставшее явным условие «внешний ключ не равен null» по ключу BI, указывающему на Cl) оставляют 28. Вложенные циклы для Cl считывают 28 строк из этой таблицы (так как на данный момент во всех строках есть внешние ключи, не равные null, которые указыва-
306

Приложение А. Решения задач

ют на Cl), после чего фильтр оставляет 3 записи. Вложенные циклы для В2 считывают 3 строки из этой таблицы, после чего итоговый фильтр оставляет 0 или 1 строку в качестве результата.
Предыдущая << 1 .. 143 144 145 146 147 148 < 149 > 150 151 152 153 154 155 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100