|
Программирование >> Полное сканирование таблицы
Аб: 1 200 ООО 07: SELECT COUNT(*) А7 FROM Orders 0. Order Details 00 WHERE DD.0rder ID = O.Order ID: A7: 1 2000 ООО 08: SELECT COUNTC*) A8 FROM Shipments: A8: 540 ООО 09: SELECT COUNTC*) A9 FROM Shipments S. Order Details OD WHERE OD.ShipmentJD = S.ShipmentJD: A9: 1 080 ООО QIO: SELECT COUNTC*) AlO FROM Products: AlO: 12 ООО Oil: SELECT COUNTC*) All FROM Products P. Order Details OD WHERE OO.ProductJD = P. Product JD: All: 1 200 ООО Q12: SELECT COUNTC*) A12 FROM Addresses: A12: 135 ООО 013: SELECT COUNTC*) A13 FROM Addresses A, Shipments S WHERE S.Address ID = A.Address ID: A13: 540 ООО ПРИМЕЧАНИЕ Я уменьшил размеры таблиц в этом примере, чтобы предоставить удобные сценарии генерации данных для проверки планов выполнения, которые для этих таблиц создадут стоимостные оптимизаторы. Самые большие таблицы в этом примере будут, вероятно, приблизительно в 10 раз меньше, чем в реальных условиях. Начиная с коэффициентов фильтрации, найдите средневзвешенный коэффициент фильтрации для условия по Customers Phone Number непосредственно как А1, то есть результат запроса Q1 (0,000003). Точно так же найдите коэффициент фильтрации для Orders, из Q3, который для A3 возвращает результат 0,2. Так как у остальных четырех псевдонимов фильтров нет, коэффициенты фильтрации для них равны 1,0 и их значение не нужно указывать на диаграмме запроса для этих узлов. Для каждого соединения найдите детальный коэффициент соединения и запишите его у верхнего конца каждой стрелки, обозначающей соединение. Для этого разделите количество строк, возвращаемое при соединении двух таблиц, на количество строк в нижней таблице (главной для этого отношения главной и детальной таблиц). Коэффициенты для верхних концов соединения от 0D к S, О и Р равны 2 (А9/А8), 3 (А7/А4) и 100 (А11/А10), соответственно. Коэффициент для верхнего конца соединения от S к А равен 4 (А13/А12). Коэффициент для верхнего конца соединения от О к С равен 0,8 (А5/А2). Найдите главные коэффициенты соединения и поместите их у нижнего конца каждой стрелки, обозначающей соединение. Для этого разделите количество строк, S Р О 0.2 А С 0.000003 Рис. Б.5. Полная диаграмма запроса Решение диаграммы запроса После того как вы упростили содержащий различные детали запрос до абстрактной диаграммы соединения, то прошли уже 80 % пути поиска лучшего плана выполнения, так же, как проблемы эквивалентности в математике обычно становятся тривиальными, если преобразовать их в символьную форму. Однако вам еще предстоит решить символьную задачу. Используя методы из главы 6, решите задачу, абстрактно изображенную на рис. Б.З. 1. Выберите лучшую ведущую таблицу. Лучший (наиболее близкий к 0) коэффициент фильтрации принадлежит С, поэтому ведущей выберите таблицу С. 2. От С вниз не ведут никакие соединения, поэтому надо выбрать единственное соединение вверх с О, поместив О второй в порядок соединения. ПРИМЕЧАНИЕ Даже если бы существовали соединения вниз от С, вы бы все равно выбрали соединение с О, так как детальный коэффициент соединения с О меньше 1,0, и у О собственный хороший фильтр. 3. У О нет необработанных соединений вниз, поэтому выберите единственное соединение вверх с 0D, поместив 0D третьей в порядок соединения. 4. Начиная с 0D, мы обнаруживаем два необработанных соединения вниз: с S и с Р. Для оставшихся узлов нет простых фильтров, но существует скрытый фильтр соединения в соединении с S, так как главный коэффициент соединещщ для него меньше 1,0. Таким образом, следует присоединить S, помещая ее четвертой в порядок соединения. возвращаемое соединением двух таблиц, на количество строк в каждой верхней таблице (детальной для этого отношения главной и детальной таблиц). Коэффициент для нижнего конца соединения от 0D к S равен 0,9 (А9/А6). Все прочие главные коэффициенты соединения оказываются равными 1,0, поэтому на диаграмме их указывать не нужно. Добавьте коэффициенты фильтрации и коэффициенты соединения к скелету запроса (см. рис. Б.З), чтобы создать полную диаграмму запроса, показанную на рис. Б.З. OD 3 ПРИМЕЧАНИЕ Если бы существовал фильтр для узла Р, то вы бы сделали неявный фильтр OD.Shlpment ID IS NOT NULL явным. Тогда вы могли бы использовать этот фильтр перед соединением с S и перейти к фильтру для Р после того, как получите преимущества фильтра NOT NULL, не платя дополнительную цену за соединение с S перед Р. 5. Оставшиеся узлы, А и Р, не фильтруются, и достижимы при помощи соединений от уже обработанных таблиц. Их главные коэффициенты соединен равны 1,0, поэтому нет разницы, в каком порядке присоединять их. Просто для упорядочения произвольно выберите А пятой в порядке соединения, а Р присоедините последней. Таким образом, оптимальный порядок соединения - (С. О, 0D, S. А. Р). 6. Получив порядок соединения, укажите полный план вьшолнения, следуя правилам для надежных планов вьшолнения, в оптимальном порядке соединения. 1) Перейти к первой таблице Customers через индекс по столбцу фильтрации, PhoneNumber. Если это необходимо, следует изменить запрос, чтобы сделать этот индекс доступным и полезным. 2) Методом вложенных циклов присоединить Orders через индекс по внешнему ключу Customer ID. 3) Методом вложенных циклов присоединить Order Detans через индекс по внешнему ключу Order ID. 4) Методом вложенных циклов присоединить Shipments через индекс по первичному ключу ShipmentlD. 5) Методом вложенных циклов присоединить Addresses через индекс по первичному ключу Address id. 6) Методом вложенных циклов присоединить Products через индекс по первичному ключу Product ID. Второй шаг процесса настройки завершен. Далее необходимо проверить, какой план выполнения фактически применяется во всех трех базах данных, так как этот пример иллюстрирует SQL, предназначенный для выполнения во всех этих базах данных. Проверка планов выполнения Для этого примера предположим, что разработка базы проводится в Oracle, а затем она тестируется, чтобы проверить, что тот же SQL-код правильно работает и в DB2, и в SQL Server. Вы узнали об этом SQL-коде, так как в Oracle он выполнялся медленнее, чем ожидалось, поэтому уже подозреваете, что он выдает плохой план вьшолнения, по крайней мере, в этом сервере баз данных. Вам будет необходимо проверить планы вьшолнения и в других базах данных, которые еще не были протестированы. Получение плана выполнения в Oracle Поместите SQL в файл с именем tmp. sql и запустите сценарий ex. sql, как описано в главе 3. Вы получите следующий результат:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |