Лабораторная работа №7. Указания

1. Создание заданий

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

1.1 Общие настройки экземпляра

За выполнение заданий отвечают следующие фоновые процессы:

Координатор очереди заданий - CJQ0.

Подчиненные процессы – J000-J999, которые и выполняют задания.

Максимальное число подчиненных процессов определяется параметром инициализации JOB_QUEUE_PROCESSES, эти процессы порождаются не в момент запуска экземпляра, а динамически координатором, в зависимости от числа заданий требующих исполнения в данный момент времени. Если значение параметра JOB_QUEUE_PROCESSES равно 0, то процесс координатор не запускается, и задания выполняться не будут.

Пользователь создающий задание должен обладать привилегией CREATE JOB .

1.2 Управление заданиями, используя пакет dbms_job

До версии Oracle 9i включительно единственным средством управления заданиями был пакет dbms_job, позволявший выполнять следующие операции:

Создание задания:

SQL> variable v_job number;

SQL> begin

bmit(job => :v_job,

what => 'insert into test_l6(dt) values (sysdate);',

next_date => sysdate,

interval => 'sysdate+1/(24*60)');

commit;

end;

/

Используя процедуру submit создается задание:

what - выполняемый sql или pl/sql оператор, в примере – вставка в поле dt таблицы test_l6 текущей даты.

НЕ нашли? Не то? Что вы ищете?

next_date – время первого запуска, в данном примере – время создания задания

interval – выражение для вычисления времени следующего запуска. В примере устанавливается время следующего запуска – 1 минута после текущего запуска (1 день разделить на 24 часа в сутках и 60 минут в часе).

Номер созданного задания записывается в переменную, передаваемую в параметр job.

Обратите внимание, что после выполнения bmit обязательно должен выполниться commit.

Изменения задания – используется процедуру change, параметры аналогичны параметрам предыдущей процедуры. В параметр job передается номер изменяемого задания.

Удаление задания – процедура remove. В параметр job передается номер удаляемого задания.

После выполнения процедур изменения/удаления, также должен выполняться commit.

Получить информацию о существующих заданиях можно из представления словаря данных dba_jobs например, запрос получающий номер задания, действие, время последнего выполнения и время следующего выполнения:

sql>select job, what, to_char(last_date,'hh24:mi:ss') ld, to_char(next_date,'hh24:mi:ss') nd from dba_jobs;

JOB WHAT LD ND

---------- -------------------------------------------------- -------- --------

21 insert into test_l6(dt) values (sysdate); 23:47:26 23:48:26

Подробнее о пакете dbms_job: http://docs. /cd/E11882_01/appdev.112/e40758/d_job. htm#ARPLS019

1.3 Управление заданиями, используя пакет dbms_scheduler

Начиная с версии 10g, существует новая версия планировщика, обладающая следующими возможностями:

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

Рассмотрим создание задания аналогичного приведенному в п. 1.2, используя сущности «программа» и «расписание».

Создание программы:

begin

dbms_scheduler. create_program(

program_name => 'test_prog',

program_type => 'PLSQL_BLOCK',

program_action => 'insert into test_l6(dt) values (sysdate);',

enabled => true,

comments => 'тестовая программа');

end;

Создается программа с именем test_prog тип которой plsql или sql оператор. Программа доступна для выполнения (enabled => true), также установлен комментарий. В дальнейшем информацию о созданных программах можно получить из представления dba_scheduler_programs.

Если бы было необходимо создать программу, соответствующую программе операционной системе сервера (например, выполнение экспорта), операция создания выглядела бы следующим образом:

begin

dbms_scheduler. create_program(program_name => 'test_ext_prog',

program_type => 'EXECUTABLE',

program_action => 'c:\app\test_exp. cmd',

enabled => true,

comments => 'тестовая внешняя программа');

end;

Тип программы указывается EXECUTABLE, в качестве действия указывается файл сценария c:\app\test_exp. cmd внутри которого уже осуществляется вызов утилиты exp.

Пользователь создающий такие программы должен обладать системной привилегией CREATE EXTERNAL JOB.

Создание расписания:

begin

dbms_scheduler. create_schedule(schedule_name => 'test_sched',

start_date => null,

repeat_interval => 'FREQ=MINUTELY;INTERVAL=2',

end_date => null,

comments => 'тестовое расписание');

end;

start_date – дата начиная с которой будет выполняться связанная с расписанием программа, если null, то программа начнет выполняться с момента доступности задания.

end_date - дата окончания выполнения связанной с расписанием программы.

repeat_interval – интервал повторения, в данном примере - через каждые 2 минуты.

Примеры значений repeat_interval:

FREQ=DAILY; INTERVAL=10; - через каждые 10 дней

FREQ=DAILY; BYHOUR=16,17,18; - каждый день в 16,17 и 18 часов

FREQ=MONTHLY; BYMONTHDAY=29; - 29 – число каждого месяца

Информация о созданных расписаниях - dba_scheduler_schedules.

Создание задания:

begin

dbms_scheduler. create_job(job_name => 'test_job',

program_name => 'test_prog',

schedule_name => 'test_sched',

enabled => true,

auto_drop => false,

comments => 'тестовое задание');

end;

Отмечаем, что задание доступно (enabled), и его не нужно удалять (auto_drop), после того как оно потеряет актуальность. На самом деле это задание никогда не потеряет актуальность, т. к. в расписании значение end_date было задано null.

Созданная ранее программа 'test_prog' может участвовать в другом задании с другим расписанием. Аналогично и для расписания 'test_sched'.

Если нет необходимости в отдельном объявлении расписания и программы, задание может быть создано в один прием:

begin

dbms_scheduler. create_job(job_name => …,

job_type => …,

job_action =>…,

start_date => …,

repeat_interval => …,

end_date => …,

enabled => …,

auto_drop => …,

comments => …);

end;

Параметры job_type и job_action соответствуют program_type и program_action при создании программы, а start_date, repeat_interval и end_date расписанию.

Информацию о заданиях созданных с использованием dbms_scheduler можно получить из представления dba_scheduler_jobs.

Остановка задания:

begin

dbms_scheduler. disable('имя задания');

end;

Дальнейшее включение:

begin

dbms_scheduler. enable('имя задания');

end;

Удаление задания:

begin

dbms_scheduler. drop_job(''имя задания ');

end;

Подробнее о планировщике заданий:

http://docs. /cd/E11882_01/appdev.112/e10577/d_sched. htm#ARPLS72235

2. Статистика данных и ее сбор.

Статистика данных является ключевым фактором при построении плана выполнения запроса.

2.1 Просмотр существующей статистики данных

Значения статистики данных можно получить из представлений словаря данных dba/all/user_tables для таблиц и dba/all/user_indexes для индексов.

Поля со значениями статистики данных в представлении USER_TABLES

NUM_ROWS

Число строк

BLOCKS

Число занятых блоков

CHAIN_CNT

Число строк, находящихся более чем в одном блоке

AVG_ROW_LEN

Средний размер строки данных в байтах

Поля со значениями статистики данных в представлении USER_TABLES

BLEVEL

Количество уровней в B*-дереве индекса

LEAF_BLOCKS

Число листовых блоков индекса

DISTINCT_KEYS

Количество различных значений в проиндексированном столбце (столбцах). Для уникальных индексов равно числу строк в проиндексированной таблице

AVG_LEAF_BLOCKS_PER_KEY

Среднее число листовых блоков, в которых встречается одно и тоже значение ключа индекса. Для уникальных индексов эта величина равна 1.

AVG_DATA_BLOCKS_PER_KEY

Среднее количество блоков данных таблицы, соответствующих одному значению ключа индекса.

CLUSTERING_FACTOR

Фактор кластеризации, характеризует соответствие упорядоченности строк в таблице упорядоченности значений индекса.

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

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

2.2 Сбор статистики данных

Сбор статистики для отдельной таблицы:

begin

dbms_stats. gather_table_stats (

ownname => ‘схема’,

tabname => ‘таблица’,

cascade => TRUE/FALSE

);

end;

/

Параметр cascade определяет, нужно ли собирать статистику для всех индексов таблицы. Для сбора статистики отдельного индекса используется процедура dbms_stats. gather_index_stats.

Для сбора статистики по всем таблицам схемы:

dbms_stats. gather_schema_stats .

Подробнее о сборе статистики и остальных процедурах пакета dbms_stats:

http://docs. /cd/E11882_01/appdev.112/e40758/d_stats. htm#ARPLS059

3. Получение плана выполнения запроса и статистики выполнения.

Для получения статистики выполнения (количества логических/физических чтений, использования времени процессора) конкретного запроса в SQLPlus перед выполнением этого запроса должен быть установлен параметр autotrace :

SET AUTOTRACE {OFF | ON | TRACEONLY} [EXPLAIN] [STATISTICS]

ON | OFF включает/выключает autotrace

TRACEONLY не показывать результат выполнения запроса.

EXPLAIN показывать только план выполнения запроса

STATISTICS показывать только статистику выполнения запроса

Т. е. после выполнения команды

SQL>set autotrace on

и выполнения запроса select * from t

Будет выведен собственно сам результат запроса, план выполнения и значения статистики выполнение.

А если перед выполнением запроса было установлено

set autotrace traceonly

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

Для того чтобы любой пользователь ORACLE мог использовать autotrace предварительно системный администратор должен выполнить:

Перед запуском SQLPlus установить переменную окружения ORACLE_HOME если она не установлена:

Для виртуальной машины:

set ORACLE_HOME=C:\app\admin\product\11.2.0\dbhome_1

Значение oracle_home для установки, можно посмотреть в реестре Windows:

После установки oracle_home, в SQLPlus, подключившись как sysdba необходимо выполнить:

SQL> @%ORACLE_HOME%/rdbms/admin/utlxplan

SQL> create public synonym plan_table for plan_table;

SQL> grant select, insert, update, delete on plan_table to public;

SQL> @%ORACLE_HOME%/sqlplus/admin/plustrce

SQL> grant plustrace to public;

4. Создание хранимых процедур

Приводится только необходимые для выполнения данной лабораторной работы сведения.

Синтаксис хранимой процедуры

CREATE PROCEDURE имя (параметр in/out/in out тип)

AS

DECLARE

переменная тип;

BEGIN

SQL-оператор;

……..;

END;

Процедура вставки n строк в таблицу, со случайным значением поля value от 1 до 20:

CREATE PROCEDURE add_lines(n in number)

as

begin

for i in 1..n loop

insert into test1(id, name)

values(i, floor(dbms_random. value(1,20)));

end loop;

end;

/

Вызов процедуры:

exec add_lines(50);

Тестовая процедура, внутри которой выполняется выборка данных:

CREATE PROCEDURE count_lines

as

declare

v number;

begin

select count(*)

into v

from test1;

end;

/

5. Получение AWR отчета.

Параметры создания AWR снимков:

Интервал создания – как часто снимки создаются в автоматическом режиме.

Поле snap_interval представления DBA_HIST_WR_CONTROL. По умолчанию, интервал создания равен одному часу. Для того чтобы установить значение интервала создания в 20 минут, нужно выполнить:

BEGIN

DBMS_WORKLOAD_REPOSITORY. MODIFY_SNAPSHOT_SETTINGS( interval => 20);

END;

/

Принудительное создание снимка:

BEGIN

DBMS_WORKLOAD_REPOSITORY. CREATE_SNAPSHOT ();

END;

/

Получение AWR отчета:

SQL>@%ORACLE_HOME%/rdbms/admin/awrrpt. sql

Тип отчета необходимо указать - html

Количество дней – 1

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

После этого указывается имя результирующего файла отчета. Возможно, сразу указать путь, где файл будет расположен. Например:

C:\app\admin\report1.html

Для получения отчета, сравнивающего 2 периода, используется сценарий

awrddrpt. sql

Подробнее о AWR:

http://docs. /cd/E11882_01/server.112/e16638/autostat. htm#PFGRF027