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

 

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

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

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


1. Перейти к таблице Customers, используя индекс по (Last_Name. First_Name), каким-либо образом модифицировав запрос, чтобы этот индекс был доступным и полностью пригодным.

2. Соединить, применяя вложенные циклы, с таблицей Orders, используя индекс по внешнему ключу Customer_ID.

3. Соединить, применяя вложенные циклы, с Code_Transl ati ons (ОТ), используя его индекс по первичному ключу (Code_Type. Code).

4. Соединить, применяя вложенные циклы, с Order_Detai I s, используя индекс по внешнему ключу 0rder_ID.

5. Соединить, применяя вложенные циклы, с Code_Translations (0DT), используя его индекс по первичному ключу (Code_Type. Code).

6. Внешнее соединение с применением вложенных циклов с Products, используя его индекс по первичному ключу Product_ID.

7. Внешнее соединение с применением вложенных циклов с Shi pments, используя его индекс по первичному ключу Shi pment_ID.

8. Внешнее соединение с применением вложенных циклов с Addresses, используя его индекс по первичному ключу Address_ID.

9. Если необходимо, сортировка полученных результатов.

Любой план выполнения, не следующий этому порядку соединения, не использующий вложенные циклы или не использующий указанные индексы, не будет оптимальным надежным планом. Правильный выбор ведущей таблицы и индекса — это ключевая проблема в 90 % случаев, и этот пример не будет исключением. Первое препятствие при получении правильного плана — это проблема получения доступа к правильному ведущему фильтрующему индексу на первом шаге. В Oracle можно использовать функциональный индекс по значениям столбцов Last_Name и First_Name в верхнем регистре, чтобы при переходе к индексу не было сложных выражений. В других базах данных вы можете увидеть, что имена всегда хранятся (или должны храниться) в верхнем регистре, или вы можете денормали-зовать структуру новыми индексированными столбцами, которые повторяют имена в верхнем регистре, или же изменить приложение так, чтобы поиск зависел от регис-
164

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

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

Теперь, когда вы можете правильно выбрать и обратиться к ведущей таблице, все ли проблемы решены? Практически всегда у вас есть индексы по необходимым первичным ключам, но хорошо разработанная база данных не гарантирует (или не должна гарантировать), что у каждого внешнего ключа также есть индекс, поэтому следующая вероятная задача — убедиться, что существуют индексы по внешним ключам Orders(Customer_ID) и Order_Details(Order_ID). Они позволяют использовать необходимые для надежного плана, начинающегося с Customers, соединения вверх методом вложенных циклов.

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

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

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

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

Сложное 17-стороннее соединение

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

Для шага 1 быстро находим, что у В4 наилучший коэффициент фильтрации, равный 0,001, поэтому выбираем эту таблицу ведущей. Tакой селективный фильтр лучше использовать вместе с индексом, поэтому в реальной задаче, если бы это был достаточно важный запрос, можно было бы создать новый индекс, чтобы использовать его для обработки В4. Ho сейчас мы будем заниматься только порядком соединения. Шаг 2 говорит, что далее следует проверить присоединенные снизу узлы С4 и С5, отдавая предпочтение соединению с узлами с лучшей фильтрацией. Коэффициент фильтрации для С5 равен 0,2, а для С4 — 0,5, поэтому далее мы будем проводить соединение с С5. На данный момент порядок соединения (В4, С5), и облако вокруг уже соединенных таблиц выглядит как на рис. 6.5.
Предыдущая << 1 .. 77 78 79 80 81 82 < 83 > 84 85 86 87 88 89 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100