Программирование >>  Полное сканирование таблицы 

1 ... 42 43 44 [ 45 ] 46 47 48 ... 107



О ODT

А С ОТ

Рис. 5.4. Скелет запроса

Вычисление коэффициентов фильтрации и соединения

у нас нет условий фильтрации для дополнительных таблиц внешних соединений, поэтому для этих таблиц и соединения нам не нужна статистика. Также вспомните, что обманчивые условия фильтрации ОТ. Code Type - ORDER STATUS и ODT. Code Type = ORDER DETAIL STATUS не осуществляют фильтрацию в чистом виде, а относятся к соединениям с соответствующими таблицами, так как являются частью ключей соединения для доступа к этим таблицам. Таким образом, у нас остаются только условия фильтрации по имени покупателя и дате заказа. Если вы хотите попрактиковаться в методе поиска коэффициентов соединения и фильтрации для диаграммы запроса, то перед тем, как читать дальше, попробуйте написать запросы для получения нужных чисел и формулы вычисления коэффициентов.

Селективность условий по именам и фамилиям зависит от длины соответствующих шаблонов. Подсчитайте селективность, предполагая, что параметры : Last Name и :First Name обычно привязываются к первым трем буквам каждого имени, и что пользователи производят поиск по распространенным трехбуквенным строкам (а это действительно так для реальных имен) пропорционально намного чаще, чем по редко встречающимся. Так как это пример для Oracle, используйте выражение Oracle SUBSTR(Char Col .1.3) для возвращения первых трех символов значений из каждого из этих символьных столбцов.

Вспомните, что для таблицы с яблоками и апельсинами Code Trans 1 ati ons вам нужно собрать статистику только по определенным типам, как если бы каждый тип хранился в собственной отдельной физической таблице. Другими словами, если ваш запрос использует коды состояния заказа в некоторых условиях соединения, то следует запросить из Code Transl ati ons не общее количество строк в этой таблице, а количество строк для состояния заказа. Оказывается, только строки таблицы для типов, участвующих в запросе, значительно влияют на стоимость запроса. Возможно, вам придется опрашивать одну таблицу дважды, но для различных подна-боров этой таблицы. Пример 5.3 опрашивает Code Transl ati ons один раз, чтобы под-

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



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

Пример 5.3. Запросы статистики для настройки запроса

Q1: SELECT SUM(COUNT(*)*C0UNT(*))/(SUM(COUNT(*))*SUM(C0UNT(*))) Al FROM Customers

GROUP BY UPPER(SUBSTR(First Name. 1, 3)), UPPER(SUBSTR(Last Name, 1, 3)): 0.0002

02 A2

04 A4

06 A6

A8 09

SELECT COUNTC*) A2 FROM Customers: 5000000

SELECT COUNT(*) A3 FROM Orders WHERE Order Date > SYSDATE - 366; 1200000

SELECT COUNTC*) A4 FROM Orders: 4000000

SELECT COUNTC*) A5 FROM Orders 0. Customers С WHERE 0.Customer I0 = C.CustomerJD: 4000000

SELECT COUNTC*) A6 FROM Order Details: 12000000

SELECT COUNTC*) A7 FROM Orders 0. Order Details OD

WHERE OD.Order ID = 0.OrderJD:

12000000

SELECT COUNTC*) A8 FROM Codejranslations

WHERE Code Type = ORDER STATUS:

SELECT COUNTC*) A9 FROM Orders 0. Codejranslations ОТ WHERE 0.StatusJode = ОТ.Code AND Code Type = ORDERJTATUS: A9: 4000000

010: SELECT COUNTC*) AlO FROM Codejranslations

WHERE Codejype = ORDERDETAIL STATUS: AlO; 3

Oil: SELECT COUNTC*) All FROM Order Details DD. Codejranslations ODT WHERE OD.StatusJode = ODT.Code AND Codejype = ORDER DETAIL STATUS: All: 12000000

Начиная с коэффициентов фильтрации, получите средневзвешенный коэффициент фильтрации для условия по имени и фамилии покупателей (таблица Customers) напрямую из А1. Результат этого запроса равен 0,0002. Найдите коэффициент фильтрации для Orders как АЗ/А4, что в итоге дает 0,3. Так как для других псевдонимов фильтров нет, коэффициенты фильтрации для них равны 1,0, которые не нужно указывать на диаграмме запроса для соответствующих узлов.

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



ползп1енных при соединении двух таблиц, на количество строк в нижней таблице (главной таблице в этом отношении). Коэффициенты для соединений от 0D к О и ODT равны 3 (А7/А4) и 4 ООО ООО (А11/А10), соответственно.

ПРИМЕЧАНИЕ

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

Коэффициенты для соединений от О к С и ОТ равны 0,8 (А5/А2) и 1 ООО ООО (или Im, А9 / АВ), соответственно.

Найдите главные коэффициенты соединения для нижних концов всех стрелок, обозначающих внутренние соединения, разделив количество строк, полученных при соединении, на количество строк в верхней таблице. Если у вас есть обязательные внешние ключи и обеспечена целостность ссылочных данных (внешние ключи всегда указывают на существующие значения первичного ключа), то главные коэффициенты соединения всегда в точности равны 1,0, что верно для всех случаев в нашем примере: А7/А6, А11/А6, А5/А4 и А9/А4.

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

Затем запишите все числа на диаграмме запроса, как показано на рис. 5.5.


С 0.0002 от

Рис. 5.5. Полная диаграмма запроса для второго примера

Сокращения

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

Узнать, какие столбцы являются первичными ключами, обычно можно исходя из их имен.

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

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



1 ... 42 43 44 [ 45 ] 46 47 48 ... 107

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика