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

 

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

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

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

82

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

В других операционных системах, отличных от Unix, можно попробовать подобные фокусы или же просто дописать содержимое файла head. sql в начало tmp. sql, содержимое tai I. sql в конец tmp. sql и выполнить сценарий целиком. Это работает во всех операционных системах. Вот пример выполнения этого процесса на том же запросе, который я рассматривал ранее, начиная с команды qui t, чтобы выйти в строку приглашения оболочки: db2 => quit:

DB20000I The QUIT command completed successfully.

$ cat head.sql tmp.sql tail.sql | db2 +c +p -t DB20000I The SQL command completed successfully.

DB20000I The SQL command completed successfully.

OPERATORJD TARGETJD 0PERAT0R_TYPE OBJECT_NAME COST

1 - RETURN - 186

2 I TBSCAN - 186

3 2 SORT - 1B6

4 3 FETCH EMPLOYEES 186

5 4 IXSCAN EMP_MGRJD 25

5 record(s) selected.

DB20000I The SQL command completed successfully.

$

На практике оказывается, что половина всех изменений, которые вы внесете при настройке плана выполнения, будет сделана в tmp.sql, а вторая половина — в среде базы данных при помощи интерфейса командной строки db2. Это будет создание и удаление индексов, создание статистики по таблицам и индексам или изменение параметров для оптимизации сеанса.

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

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

-- File called tmp.sql

SELECT E.First_Name. E.Last_Name. E.Salary. LE.Description.

M.First_Name. M.Last_Name. LM.Description FROM Employees E

INNER JOIN Locations LE ON E.Location_ID=LE.Location_ID INNER JOIN Employees M ON E.Manager_ID=M.Employee_ID INNER JOIN Locations LM ON M.Location_ID=LM.Location_ID WHERE E.Last_Name = ?

AND UCASE(LE.Description) = ? :

Чтобы продемонстрировать этот код на реальных данных, я поместил в таблицу Empl oyees 100 ООО строк, причем для Last Name у меня есть 10 ООО различных значений. В таблицу Locations я поместил 1 ООО строк. После подключения к DB2 в каталоге, где находятся файлы tmp. sql, head. sql и tai I. sql, я вышел в командную строку оболочки. Затем выполнил команду cat head. sql tmp. sql tai I. sql | db2 +c +p -
Чтение планов выполнения в DB2

83

t и получил следующий выход с индексами только по первичным ключам

и Employees(Last_Name):

$ cat head.sql tmp.sql tail.sql | db2 +c +p -t DB20000I The SQL command completed successfully.

DB20000I The SQL command completed successfully.

0PERAT0R_ID TARGET_ID 0PERAT0R_TYPE OBJECT_NAME COST

1 - RETURN - 305
2 I NLJOIN - 305
3 2 NLJOIN - 2B5
4 3 NLJOIN - 260
5 4 FETCH EMPLOYEES 80
6 5 IXSCAN EMP LAST NAME 50
7 4 FETCH LOCATIONS 50
8 7 IXSCAN LOCATION PKEY 25
9 3 FETCH EMPLOYEES 75
10 9 IXSCAN EMPLOYEE PKEY 50
11 2 FETCH LOCATIONS 50
12 11 IXSCAN LOCATION PKEY 25

12 record(s) selected.

DB20000I The SQL command completed successfully.

$

Интерпретация плана

План выполнения читается следующим образом.

¦ Все соединения выполняются при помощи вложенных циклов и показаны как набор строк, содержащих NLJOI N. Если вы используете различные методы соединения, то соединение, выполняемое первым, будет перечислено последним. Порядок выполнения соединений следует читать снизу вверх.

¦ Порядок доступа к таблицам — Employees, Locations, Employees, Locations. В том же самом порядке они перечислены в плане выполнения. Когда SQL обращается к одним и тем же таблицам несколько раз, псевдонимы для таблиц обязательны. Как можно видеть в примере в разделе FROM, для таблицы Employees есть два псевдонима — E и М. Изучая индекс, можно понять, что именно псевдоним Е, а не псевдоним M представляет ведущую таблицу, хотя оба псевдонима указывают на одну и ту же таблицу Empl oyees. He так очевидно, к какому из псевдонимов для Locations база данных обращается первой, но это должен быть LE1 так как только к нему можно обратиться вторым в порядке соединения.

¦ Все четыре операции считывания из таблиц производятся при помощи индекса, на что указывает 0PERAT0R_TYPE FETCH перед каждым именем таблицы. Используемые индексы указаны в записях 0PERAT0R_TYPE IXSCAN под записями о доступе к каждой таблице. Так, вы знаете, что обращение к ведущей таблице E производится путем сканирования индекса EMP_LAST_NAME (причем считывание хотя бы потенциально затрагивает несколько строк за раз). Все остальные операции доступа к таблицам — это уникальные считывания, так как в них используются условия уникальности для первичных ключей таблиц. Так как все операции считывания, которые выполняются после обработки ведущей таблицы, относятся к уникальным соединениям, вы знаете, что максимальное количе-
84

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