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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 122 123 124 125 126 127 < 128 > 129 130 131 132 133 134 .. 161 >> Следующая


Объяснение преимуществ от поздних соединений

Иногда, особенно когда узлы вообще не фильтруются, наибольшее преимущество соединения заключается в том, что оно обеспечивает доступ к узлам, находящимся на уровень ниже, но имеющим хороший фильтр. Это причина еще одного исключения, описанного в главе 6: «В трудном случае выбирайте обработку таблиц, открывающих доступ к другим таблицам с лучшими коэффициентами фильтрации, как можно раньше в плане выполнения. Общая цель — отбросить максимальное количество строк как можно раньше в плане выполнения. Хорошие (небольшие) коэффициенты фильтрации достигают этой цели на каждом шаге, но вам следует смотреть немного дальше и проверять следующие фильтры, чтобы воспользоваться полным преимуществом скорейшего перехода к данному узлу».

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

Когда следует выбирать ранние соединения с узлами наверху

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

261

соединения, который должен быть меньше или равен 1,0, детальный коэффициент соединения может быть любым положительным числом, и обычно он больше 1,0. Когда он велик, то F обычно больше 1,0, а отношение преимуществ к стоимости, (I - F)/C, меньше нуля, что делает соединение вверх менее привлекательным, чем даже совершенно не фильтрованное соединение вниз (для которого I-F равно 0). Когда F больше 1,0, выбор очевиден. Следует отложить соединение вверх, пока все соединения вниз не будут обработаны. Даже когда детальный коэффициент фильтрации (D) настолько мал, что F меньше 1,0, раннее соединение вверх не всегда может быть оправданным. Детальный коэффициент фильтрации может быть намного больше для других пользователей, которые будут работать с тем же приложением. Этот же коэффициент может стать больше для того же пользователя в иных условиях. Раннее соединение вверх, выгодное для конкретного пользователя в данный момент, может позже или на других узлах принести больше вреда, чем пользы. Соединения вверх ненадежны по отношению к изменениям в распределении данных.

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

На рис. 8.6 доля строк (F) для А равна 0,2 (0,1 х 2), столько же, сколько и для лучшего узла снизу — ВЗ. Ho стоимость (С) будет минимум в два раза выше, чем для любого узла снизу, так как база данных должна считать две строки из А для каждой строки из уже соединенных узлов, стоящей в начале соединения. Задав Cd (стоимость каждой строки детальной таблицы) равной 2 ? Cm (стоимость соединения с каждой строкой главной таблицы в худшем случае), мы получим (1-- 0,2)/(2 х Cm) = (I - Fe)/Cm, где Fe — коэффициент фильтрации, который был бы у худшего соединения вниз, если бы отношение преимуществ к стоимости для него равнялось соединению вверх с А. Находя Fe, получаем 1 - Fe = 0,8/2, или Fe = 0,6. Основываясь на этом расчете, вы точно выберете соединения с ВЗ, В4 и В2 до соединения с А. Даже соединение с В5, вероятно, было бы лучше провести перед соединением с А, так как В5 должна быть лучше кэширована и иметь менее глубокий индекс, чем А. Соединение с BI можно безопасно отложить до выполнения соединения с А, если вы уверены, что коэффициент F для А никогда не превысит 1,0, и для узлов ниже BI нет дополнительных фильтров. К моменту, когда вы достигнете точки, в которой соединение вверх должно быть выполнено до соединения вниз, это практически не имеет значения, так как после применения предыдущих фильтров осталось уже так мало строк, что экономия по сравнению со стоимостью оставшейся части запроса минимальна. Можно сделать вывод, что вероятность необходимости хотя бы рассмотреть ранние выполнения соединений вверх, если детальный коэффициент для них равен 2 или больше, чрезвычайно мала.
Предыдущая << 1 .. 122 123 124 125 126 127 < 128 > 129 130 131 132 133 134 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100