2016-08-19

PL/SQL Developer session window

В окне списка сессий PL/SQL Developer (Tools -> Sessions) можно добавить кучу полезных вкладок, которые будут выполнять скрипты и запросы, получая любое значение из подсвеченной сессии в списке через :[ИМЯ_КОЛОНКИ v$session]. В настоящее время в стоковом PL/SQL Developer (версия 11) есть 5 вкладок:
Cursors
SQL Text
Statistics
Locks
Sql Monitor

Добавлять свои вкладки можно при помощи кнопки с гаечным ключиком -> Details

В настоящий момент я использую

План запроса dbms_xplan

Особое внимание /* concatenate */ из последней строчки – результат будет сцеплен в одно поле, его можно скопировать и вставить в другое окно для детального анализа.

SELECT t.plan_table_output || CHR(10) plan_table_output 
FROM table(dbms_xplan.display_cursor(:sql_id, :sql_child_number,format => 'ADVANCED')) t
/* concatenate */

План запроса из v$

SELECT decode(id, 1, child_number) || decode(:sql_address, '00', '-P') AS c,
       output_rows AS tot_r,
       last_output_rows AS r,
       rpad(' ', depth * 3) || operation || ' ' || options ||
       nvl2(object_name, ' -> ', '') || object_name AS op,
       cost,
       cardinality AS card,
       bytes,
       access_predicates AS "ACCESS",
       filter_predicates AS filter,
       round(temp_space / 1024 / 1024) AS temp_mb,
       partition_start || nvl2(partition_start, ' - ', '') || partition_stop AS p,
       partition_id,
       other,
       other_tag,
       cpu_cost,
       io_cost,
       distribution,
       object_owner,
       optimizer,
       position,
       search_columns,
       executions,
       last_starts,
       starts,
       last_cr_buffer_gets,
       cr_buffer_gets,
       last_cu_buffer_gets,
       cu_buffer_gets,
       last_disk_reads,
       disk_reads,
       last_disk_writes,
       disk_writes,
       round(last_elapsed_time / 1000000, 2) AS last_ela_time,
       round(elapsed_time / 1000000, 2) AS elapsed_time,
       policy,
       estimated_optimal_size,
       estimated_onepass_size,
       last_memory_used,
       last_execution,
       last_degree,
       total_executions,
       optimal_executions,
       onepass_executions,
       multipasses_executions,
       round(active_time / 1000000, 2) AS active_time_avg,
       max_tempseg_size,
       last_tempseg_size
FROM (SELECT *
      FROM v$sql_plan_statistics_all
      WHERE address = hextoraw(:sql_address)
      AND hash_value = :sql_hash_value
      UNION ALL
      SELECT *
      FROM v$sql_plan_statistics_all
      WHERE address = hextoraw(:prev_sql_addr)
      AND hash_value = :prev_hash_value) t
CONNECT BY address = PRIOR address
    AND hash_value = PRIOR hash_value
    AND child_number = PRIOR child_number
    AND PRIOR id = parent_id
START WITH id = 1
ORDER BY address, hash_value, child_number DESC, id, position

SQL Workarea

Объем памяти, потребляемой сессией. Правда не очень часто пригождается

SELECT operation_type,
       policy,
       estimated_optimal_size,
       estimated_onepass_size,
       last_memory_used,
       last_execution,
       last_degree,
       total_executions,
       optimal_executions,
       onepass_executions,
       multipasses_executions,
       active_time,
       max_tempseg_size,
       last_tempseg_size
FROM v$sql_workarea
WHERE address = hextoraw(:sql_address)
AND hash_value = :sql_hash_value

Таким способом достаточно удобно заниматься troubleshooting’ом, если известа сессия, которая испытывает проблемы. Очень удобный и мощный механизм.

Комментариев нет: