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

 

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

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

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 37 38 39 40 41 42 < 43 > 44 45 46 47 48 49 .. 161 >> Следующая


Для всех возвращенных строк, объединяющих E и LE, необходимо проделать еще несколько шагов.

¦ Используя условие соединения E.Manager_ID=M.Employee_ID, перейти к индексу по первичному ключу EMPL0YEEPKEY и найти единственный подходящий идентификатор строки, соответствующий записи сотрудника, для менеджера того сотрудника, чью запись вы уже считали. Если подходящей строки не найдено, отбросить результирующую строку, которая строится в данный момент.

¦ Иначе для подходящего идентификатора строки из предыдущего шага считать один блок (логические считывание, если требуется, физическое) из таблицы Empl oyees (M), используя ту часть идентификатора, где хранится адрес блока. Используя ту часть идентификатора строки, где хранится адрес строки, найти определенную строку, на которую указывает идентификатор, и считать из нее
86

3. Просмотр и интерпретация планов выполнения

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

¦ Для каждой такой строки, используя условие соединения M. Locati On ID=LM. Lo-cation ID, перейти к индексу по первичному ключу L0CATI0N_PKEY и найти единственный подходящий идентификатор строки, соответствующий записи о местоположении для менеджера того сотрудника, чью запись вы уже считали. Если подходящей строки не найдено, отбросить результирующую строку, которая строится в данный момент.

¦ В ином случае для подходящего идентификатора строки из предыдущего шага считать один блок (логическое считывание, если требуется — физическое) из таблицы Locati ons (LM), используя ту часть идентификатора, где хранится адрес блока. Используя ту часть идентификатора, где хранится адрес строки, найти определенную строку, на которую указывает идентификатор, и считать из нее все необходимые данные (запрошенные для псевдонима LM). Присоединить подходящие данные ко входной строке, полученной при предыдущих считываниях из таблиц, чтобы завершить результирующую строку. Немедленно вернуть полностью построенную результирующую строку.

Ненадежные планы выполнения

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

$ cat head.sql tmp.sql taiI.sql | db2 +c +p -t 0B20000I The SQL command completed successfully.

DB20000I The SQL command completed successfully.

OPERATORJD TARGETJD 0PERAT0R_TYPE OBJECT_NAME COST

I - RETURN _ 21033
2 I NLJOIN 21033
3 2 NLJOIN - 20830
4 3 MSJOIN - 10517
5 4 TBSCAN - 204
6 5 SORT - 204
I 6 TBSCAN LOCATIONS 204
8 4 FILTER - 10313
9 8 TBSCAN - 10313
10 9 SORT - 10313
11 10 TBSCAN EMPLOYEES 10313
12 3 TBSCAN EMPLOYEES 10313
13 2 TBSCAN LOCATIONS 202

13 record(s) selected.

0B20000I The SQL command completed successfully. $
Чтение планов выполнения в DB2

87

В шагах с значением идентификатора 0PERAT0R_ID с 5 по 11 сервер DB2 сортирует результаты полного сканирования таблиц Locations и Employees (псевдонимы LE и Е) по ключу соединения Location ID, отбрасывая строки, не удовлетворяющие фильтрующим условиям для этих таблиц. В шаге с 0PERAT0R_ID=4 DB2 выполняет соединение сортировкой слиянием таблиц E и LE. Интересно, что, видя такие хорошие фильтры для обеих таблиц, она решает, что на этом шаге останется максимум одна строка, и выбирает в качестве двух последних шагов вложенные циклы с полным сканированием таблиц для соединения псевдонимов M и LM. Вложенные циклы с полным сканированием таблиц, как в данном случае, будут работать плохо, если данные окажутся такими, что DB2 придется пройти цикл слишком много раз. Стоимость соединения слиянием или хэшированием будет немного выше, чем у вложенных циклов с одним полным сканированием таблицы, но такие соединения на больших объемах работают лучше.

Сложные планы выполнения

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

SELECT Е.FirstJaine. Е.Nickname. Е.LastJJame,

Е.Phone Jlumber. L.Description FROM Employees E

INNER JOIN Locations L ON E.LocationJO=L.LocationJD WHERE (E.FirstJJame= ? OR E.Nickname= ?)

AND EXISTS (SELECT I FROM Wage_Payments P

WHERE P.EmployeeJD=E.EmployeeJD

AND P. Payment Date > CURRENT OATE - 31 DAVS):

Поместите в Wage_Payments 500 ООО строк. Создайте следующие индексы.
Предыдущая << 1 .. 37 38 39 40 41 42 < 43 > 44 45 46 47 48 49 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100