|
Программирование >> Полное сканирование таблицы
нения (обычно это схема, принадлежащая пользователю, в качестве которого вы зарегистрированы). Операция DELETE в таблице EXPLAIN INSTANCE автоматически выполняет каскадное удаление данных плана выполнения из остальных шести таблиц. 2. Создайте записи плана выполнения при помощи оператора SQL EXPLAIN PLAN FOR <Настраиваемый оператор>. 3. Выведите план вьшолнения на экран любым из нескольких предусмотренных в DB2 способов, описанных ранее под заголовком Чтение планов выполнения DB2 . 4. Очистите результаты вашей работы при помощи ROLLBACK. Я продемонстрирую этот процесс на плане выполнения для простого запроса: SELECT Last Name. First Name. Salary FROM Employees WHERE Manager ID=137 ORDER BY Last Name. Fi rstjame: Далее вы видите реальное содержимое сеанса DB2 для ручного определения плана выполнения нашего запроса с общими паролями и именами: $ db2 +с -t (с) Copyright IBM Corporation 1993.1997 Command Line Processor for DB2 SDK 5.2.0 You can issue database manager commands and SQL statements from the command prompt. For example: db2 => connect to sample db2 => bind sample.bnd For general help, type: ?. For command help, type: ? command, where command can be the first few keywords of a database manager command. For example: ? CATALOG DATABASE for help on the CATALOG DATABASE command ? CATALOG for help on all of the CATALOG commands. To exit db2 interactive mode, type QUIT at the command prompt. Outside interactive mode, all commands must be prefixed with db2. To list the current command option settings, type LIST COMMAND OPTIONS. For more detailed help, refer to the Online Reference Manual. db2 => CONNECT TO Serverjame USER Userjame USING SoraePassword: Database Connection Information Database server = DB2/SUN 5.2.0 SQL authorization ID = USERJAME Local database alias = SERVER NAME db2 => SET SCHEMA Appl SchGma: DB20000I The SQL command completed successfully. db2 => DELETE FROM USERJAME.EXPLAIN INSTANCE; DB20000I The SQL command completed successfully. db2 => EXPLAIN PLAN FOR SELECT Lastjame. Fi rstjame. Salary FROM Employees db2 (cont.) => WHERE Manager ID=137 db2 (cont.) -> ORDER BY Last Name. First Name: DB20000I The SQL coimiand completed successfully. db2 => SELECT O.OperatorJD. S2.Target ID. O.OperatorJype. db2 (cont.) => S.Object Name. CAST(O.Total Cost AS INTEGER) Cost db2 (cont.) => FROM USER NAME.EXPLAIN OPERATOR 0 db2 (cont.) => LEFT OUTER JOIN USER NAME.EXPLAIN STREAM S2 db2 (cont.) => ON 0.0perator ID=S2.Source ID db2 (cont.) => LEFT OUTER JOIN USERJAME.EXPLAIN STREAM S db2 (cont.) => ON O.OperatorJD = S.TargetJD db2 (cont.) => AND O.Explain Time = S.Explain Time db2 (cont.) => AND S.Object Name IS NOT NULL db2 (cont.) => ORDER BY O.Explain Time ASC. OperatorJD ASC: OPERATOR ID TARGET ID OPERATORJYPE OBJECT NAME COST 1 - RETURN - 186 2 1 TBSCAN - 186 3 2 SORT - 186 4 3 FETCH EMPLOYEES 186 5 4 IXSCAN EMP MGR ID 25 5 record(s) selected. db2 -> ROLLBACK: DB20000I The SQL command completed successfully. db2 => Здесь показан план выполнения, который ищет диапазон индекса (в индексе Einp Mgr ID), соответствующий сотрудникам, подчиненным менеджеру с идентификатором 137. Сканирование этого диапазона индекса приводит к получению списка идентификаторов строк, которые указывают на определенные строки в определенных блоках таблицы Employees. Для каждого такого идентификатора строки DB2 выполняет операцию логического или, если необходимо, физического ввода-вывода на соответствующем, блоке таблицы, где находит указанную строку. После считывания из таблицы DB2 сортирует строки в возрастающем порядке во временной таблице по столбцам, указанным в ORDER BY. Затем производится сканирование временной таблицы, содержащей отсортированный результат. Шаги для запроса в такой форме пронумерованы в столбце OPERATOR ID. Этот запрос позволяет выполнять проход древовидного плана по столбцу TARGETID. TARGET ID указывает на шаг, являющийся родительским для данной итерации. В нашем примере у каждого предка есть единственный потомок, но в общем случае множество шагов, таких как шаги вложенных циклов, являются родительскими для пары следующих шагов. При помощи TARGET ID можно составить древовидную структуру, соответствующую плану вьшолнения. Прочие способы отображения планов вьшолнения в DB2 напрямую выводят ту же древовидную структуру, но ее сложно будет увидеть на экране полностью. Такой же тип древовидной структуры отображается при помощи отступов в планах выполнения для предыдущего запроса, который я использовал для иллюстрации планов выполнения Oracle, но в них использовалась фраза CONNECT BY, которой нет в DB2. SQL Server также использует отступы для отображения древовидной структуры плана вьшолнения, например в планах, показанных при помощи SHOWPLANJEXT (см. далее). Практический процесс отображения планов выполнения Для новичка процесс отображения планов выполнения в DB2 выглядит достаточно сложным, но вы можете автоматизировать основные шаги, написав небольшой и простой сценарий. Если вы работаете в Unix, создайте следующие файлы: -- File called head.sql DELETE FROM UserJame.EXPLAINJNSTANCE: EXPLAIN PLAN FOR -- File called tail.sql SELECT O.Operator ID. S2.Target ID. O.Operator Type. S.Object Jane. CAST(O.Total Cost AS INTEGER) Cost FROM Userjame.EXPLAIN OPERATOR 0 LEFT OUTER JOIN Userjame. EXPLAIN STREAM S2 ON 0.0perator ID=S2.Source I0 LEFT OUTER JOIN Userjame.EXPLAIN STREAM S ON O.Operator ID = S.Target ID AND O.Explain Time = S.Explain Time AND S.ObjectJame IS NOT NULL ORDER BY O.Explain Time ASC. OperatorJD ASC: ROLLBACK: С помощью файлов head.sql и tail .sql процесс отображения планов вьшолнения после того, как вы выбрали нужный план (см. главы 5-7), становится достаточно простым. 1. Поместите чистый SQL-код для анализа в файл tmp. sql, который находится в том же каталоге, что и head .sql и tai 1. sql. 2. В сеансе DB2, запущенном из того же каталога, выполните команду qui t;, чтобы выйти в строку приглашения оболочки, затем выполните команду cat head. sql tmp.sql tail.sql db2+c+p-t. 3. Настройте базу данных (например, изменив индексы) и рассматриваемый SQL код в файле tmp.sql (следуя методам, описанным в главе 4) и повторяйте предыдущий шаг в строке приглашения оболочки, пока не будет получен желаемый план вьшолнения. Затем запишите правильный результат где-либо для постоянного хранения. Редактируйте рассматриваемый SQL-код (вместе с завершающим символом точки с запятой (;)) в файле tmp.sql в любом текстовом редаеторе в одном окне. В другом окне запустите сеанс DB2 из каталога, где находятся head.sql, tail .sql и tmp. sql. Затем выйдите из обработчика командной строки DB2 командой qui t, но останьтесь в строке приглашения оболочки. Создавайте и просматривайте новые планы вьшолнения для текущей версии tmp. sql (после того, как сохраните файл!) следующей командой: cat head.sql tmp.sql tail.sql db2 +c +p -t Воспользуйтесь комбинацией клавиш для быстрого вызова, чтобы повторно вызывать эту команду по мере необходимости. Теперь для того, чтобы внести изменения в SQL-запрос и увидеть результаты, потребуется лишь несколько секунд. Если вы хотите распечатать план вьшолнения или просмотреть его в текстовом редаеторе, можно перенаправить вывод: cat head.sql tmp.sql tall.sql db2 +c +p -t > tmp.out
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |