|
Программирование >> Полное сканирование таблицы
ный коэффициент соединения. Пусть F = R х М, где R - коэффициент фильтрации, а М - главный коэффициент соединения (равный 1,0, если не указано другое число). Чем больше коэффициент сокращения количества строк, равный 1 - F, тем ниже стоимость будущих соединений, поэтому узлы с большими значениями 1 - F важны для оптимизации оставшейся части запроса, и их следует присоединить как можно раньше. У сокращения количества строк тоже есть определенная стоимость, основанная на стоимости каждой строки, участвующей в соединении, которую я обозначу С. Отношение преимуществ к стоимости рассматриваемого соединения вниз равно (1 - F)/C. Если полагать, что считьшание каждой строки из всех таблиц, находящихся ниже уже соединенных узлов, стоит одинаково, то выбор узла снизу с максимальным значением (1 - F)/C эквивалентен выбору узла с минимальным F. . узлы А 01 2 ( flpHcoeflMHBHHbre; N.. , уапы / В1 82 04 В3 02 В4 03 В5 07 -----J, Необработанные --V..*-- узлы .,. Рис. 8.6. Типичная точка выбора во время оптимизации порядка соединения Как же тогда можно улучшить оптимизацию? Существует три возможности улучшения, которые перечислены в разделе Специальные правила для специальных случаев главы 6. 1. Не у всех узлов снизу одинаковая стоимость считьшания строки соединения, поэтому в действительности параметр С отличается у разных узлов. 2. Полная выгода соединения иногда появляется не сразу, а после соединения с другими узлами, находящимися еще ниже, доступ к которым открылся через промежуточное соединение. 3. Иногда узел сверху обеспечивает лучшее отношение преимуществ к стоимости, даже если еще остались необработанные узлы внизу. Я по очереди рассмотрю эти возможности для улучшения, чтобы показать, как они влияют на специальные правила, которые иногда перекрывают простейшие правила большого пальца. Объяснение различной стоимости считывания строки Чаще всего узлы в нижней части диаграммы меньше, чем самая большая таблица, уже обработанная в плане вьшолнения. Поэтому чаще всего они лучше кэшированы и маловероятно, что для них существуют более глубокие индексы, чем для самой большой уже обработанной таблицы, поэтому их воздействие на общую стоимость обычно минимально. Даже когда стоимость считывания данных из узлов внизу значительно варьируется, стоимость предположения, что она одинакова для всех узлов, обычно минимальна по сравнению с общей стоимостью запроса. Как бы то ни было, вероятность значительных различий стоимости оправдывает исключение, уже упомянутое в главе 6: В трудных случаях сначала обрабатывайте небольшие таблицы. После того, как вы выбрали ведущую таблицу, реальное соотношение преимуществ и стоимости соединения со следующей главной таблицей равно (1 - F)/C. Небольшие таблицы лучше кэшированы и у них обычно меньше уровней индекса, что уменьшает С и улучшает соотношение преимуществ и стоимости для маленьких таблиц . Объяснение преимуществ от поздних соединений Иногда, особенно когда узлы вообще не фильтруются, наибольшее преимущество соединения заключается в том, что оно обеспечивает доступ к узлам, находящимся на уровень ниже, но имеющим хороший фильтр. Это причина еще одного исключения, описанного в главе 6: В трудном случае выбирайте обработку таблиц, открывающих доступ к другим таблицам с лучпшми коэффициентами фильтрации, как можно раньше в плане вьшолнения. Общая цель - отбросить максимальное количество строк как можно раньше в плане вьшолнения. Хорошие (небольшие) коэффициенты фильтрации достигают этой цели на каждом шаге, но вам следует смотреть немного дальше и проверять следующие фильтры, чтобы воспользоваться полным преимуществом скорейшего перехода к данному узлу . Полное объяснение этих распределенных эффектов, которые обеспечиваются фильтрами, разбросанными по разным узлам, лежит за пределами этой книги и любого метода оптимизации, предназначенного для ручного применения. К счастью, эти ограничения минимальны. Я не встречал такого случая, когда требовалось бы настолько глубокое объяснение. Практически всегда предыдущее грубое правило обеспечивает оптимальное решение или решение, настолько бли,зкое к оптимальному, чтобы различия не играли роли. Иногда стоит применить метод проб и ошибок, если вам попался граничный случай. Редкое обращение к этому методу намного проще и гораздо точнее, чем самые сложные вычисления. Когда следует выбирать ранние соединения с узлами наверху Потенциально узлы из верхней части диаграммы могут обеспечить самое эффективное соотношение преимуществ и стоимости. Для этих узлов можно подсчитать F = R X D, где R - коэффициент фильтрации узла, как и раньше, а D - детальный коэффициент соединения. Однако в противоположность главному коэффициенту соединения, который должен быть меньше или равен 1,0, детальный коэффициент соединения может быть любым положительным числом, и обычно он больше 1,0. Когда он велик, то F обычно больше 1,0, а отношение преимуществ к стоимости, (1 - Р)/С, меньше нуля, что делает соединение вверх менее привлекательным, чем даже совершенно не фильтрованное соединение вниз (для которого 1 - F равно 0). Когда F больше 1,0, выбор очевиден. Следует отложить соединение вверх, пока все соединения вниз не будут обработаны. Даже когда детальный коэффициент фильтрации (D) настолько мал, что F меньше 1,0, раннее соединение вверх не всегда может быть оправданным. Детальный коэффициент фильтрации может быть намного больше для других пользователей, которые будут работать с тем же приложением. Этот же коэффициент может стать больше для того же пользователя в иных условиях. Раннее соединение вверх, выгодное для конкретного пользователя в данный момент, может позже или на других узлах принести больше вреда, чем пользы. Соединения вверх ненадежны по отношению к изменениям в распределении данных. Большие детальные коэффициенты соединения обладают еще одним скрытым эффектом. Они указывают на большие таблицы, из которых базе данных потребуется считать несколько строк для каждой присоединяемой строки, чтс умножает С, по меньшей мере, на детальный коэффициент соединения. Если таблицы в верхней части диаграммы достаточно большие, то у них будет также больше значение С (по сравнению с соединениями вниз) благодаря плохому кэшированию и более глубоким индексам. Все эти причины обычно делают С достаточно большим, чтобы соотношение преимуществ и стоимости для соединения вверх было непривлекательным, даже с очень низкими коэффициентами фильтрации детальных таблиц. На рис. 8.6 доля строк (F) для А равна 0,2 (0,1 х 2), столько же, сколько и для лучшего узла снизу - ВЗ. Но стоимость (С) будет минимум в два раза выше, чем для любого узла снизу, так как база данных должна считать две строки из А для каждой строки из уже соединенных узлов, стоящей в начале соединения. Задав Cd (стоимость каждой строки детальной таблицы) равной 2 ? Cm (стоимость соединения с каждой строкой главной таблицы в худшем случае), мы получим (1-- 0,2)/(2 X Cm) = (1 - Fe)/Cm, где Ее - коэффициент фильтрации, который был бы у худшего соединения вниз, если бы отношение преимуществ к стоимости для него равнялось соединению вверх с А. Находя Ее, получаем 1 - Ее = 0,8/2, или Ее = 0,6. Основываясь на этом расчете, вы точно выберете соединения с ВЗ, В4 и В2 до соединения с А. Даже соединение с В5, вероятно, было бы лучше провести перед соединением с А, так как В5 должна быть лучше кэширована и иметь менее глубокий индекс, чем А. Соединение с В1 можно безопасно отложить до вьпюлне-ния соединения с А, если вы уверены, что коэффициент F для А никогда не превысит 1,0, и для узлов ниже В1 нет дополнительных фильтров. К моменту, когда вы достигнете точки, в которой соединение вверх должно быть выполнено до соединения вниз, это практически не имеет значения, так как после применения предыдущих фильтров осталось уже так мало строк, что экономия по сравнению со стоимостью оставшейся части запроса минимальна. Можно сделать вывод, что вероятность необходимости хотя бы рассмотреть ранние вьшолнения соединений вверх, если детальный коэффициент для них равен 2 или больше, чрезвычайно мала.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |