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

 

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

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

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


M

Al

А2

100

100

Ў

BI 0.001

Ў

В2 0.001

Рис. 10.1. Медленный запрос, возвращающий несколько строк
294

10. Решения сложных проблем

Если вы ослабите требование надежности, то сможете предварительно считать 100 строк, удовлетворяющих фильтру для В2 и соединить их с ранее считанными строками путем хэширования. Можно даже предварительно соединить эти 100 строк с А2 при помощи вложенных циклов и выполнить соединение хэшированием между строками, полученными при помощи метода вложенных циклов из (BI. Al, М) и строками, считанными методом вложенных циклов, которые соединяют комбинацию (В2, А2). Это позволит сократить количество строк, которое нужно считать из А2, до 10 000, и сохранить количество строк из В2 равным 100. Однако ни одна из этих стратегий не устраняет необходимости считать 50 000 строк из самой большой и хуже всех кэшированной таблицы М, и это определенно потребует больше времени, чем вам бы хотелось для запроса, возвращающего всего 50 строк.

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

Оптимизация запросов с распределенными фильтрами

Чтобы оптимально использовать распределенные фильтры, вам необходимо каким-то образом сблизить их на диаграмме запроса, лучше всего — в одной таблице. Еще раз обратимся к рис. 10.1. Предположим, что оба фильтра для BI и В2 представляют собой условие равенства для некоторого столбца таблицы, соответствующей данному фильтру. Нормализованный дизайн базы данных предполагает размещение фильтрованного столбца из BI там, где он есть, так как он кодирует свойство, которое вам нужно указать только один раз для каждой сущности BI. Более того, это свойство, о котором вы не можете узнать исходя из сущностей любой главной таблицы, которая соединяется методом «один ко многим» с BI. Если вы поместите этот столбец в Al, то это уже будет денормализация, определенная как свойство, о котором можно узнать исходя из соответствующей главной сущности Al, хранящейся в BI. Такая денормализация потребует, чтобы в таблице Al хранились избыточные данные, так как все 100 (в среднем) сущностей Al, которые соединяются с любой данной строкой BI, должны иметь одинаковое значение в этом наследованном столбце. Однако в принципе все свойства сущностей главной таблицы являются наследованными свойствами детальных сущностей, соответствующих этим сущностям главной таблицы.

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

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

295

Например, если Customer_ID — это свойство Orders, то это также наследованное свойство Order_Details, соответствующих этим заказам. С денормализацией вы всегда можете протолкнуть свойства вверх по дереву соединения к узлам, находящимся над узлами, владеющими этими свойствами в нормализованном варианте. Такое наследование фильтрующих свойств не должно останавливаться на первом уровне. Например, Customer_Name, нормализованное свойство Customers, можно наследовать на два уровня вверх, через Orders, передав его в Order_Details.

Эта возможность проталкивать столбцы фильтрации вверх по дереву соединения на любую высоту подсказывает нам итоговое решение проблем производительности с распределенными фильтрами. Чтобы избежать проблем, вызванных распределенными фильтрами, продолжайте перемещать вверх самые селективные фильтрующие условия, пока они не соединятся в одном узле, который унаследует комбинированный фильтр, селективность которого равна произведению селективностей исходных фильтров. В экстремальном случае все фильтры поднимаются на максимальную высоту в корневой детальный узел, и запрос считывает лишь несколько строк из этой таблицы, которые в итоге вернет, и соединяет их вниз с таким же количеством строк из находящихся ниже главных таблиц. В задаче, показанной на рис. 10.1, таблица M получает два денормализованных столбца, из BI и В2 соответственно. Комбинированный фильтр для этих двух столбцов обладает селективностью 0,000001 (0,001 х 0,001), или одна строка из 1 000 000, как показано на рис. 10.2. Оптимальный план выполнения для этой диаграммы запроса считывает 50 строк из M и выполняет вложенные циклы через индексы по первнчным ключам, получая по 50 строк из всех остальных таблиц, Al, А2, BI и В2. Это очень быстрый план.

M 0.000001(=0.001х0.001) 5^\5

Рис. 10.2 Перемещение фильтров к верхним таблицам с использованием денормализации
Предыдущая << 1 .. 139 140 141 142 143 144 < 145 > 146 147 148 149 150 151 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100