2008/06/17

Этот замечательный инструмент SQLTXPLAIN

В ноте 215187.1 среди прочего упоминается замечательный инструмент SQLTXPLAIN - незаменимая штуковина для аналитика.
После нескольких запусков я обнаружил маленькую неприятную деталь при использовании режима XTRACT: ORA-07445: caught exception [ACCESS_VIOLATION] at [_msqsub()+23].
Проверял на версии 10.2.0.1 (Linux 32 bit), а также на 11.1.0.6 (Win32).
Похоже, что ошибка возникает в процессе повторной генерации отчета, после перезапуска анализируемого запроса.

Одним из возможных решений проблемы может стать следующее изменение (благо, инструмент поставляется в открытом виде):
в пакете SQLTXPLAIN.sqlt$d изменить запрос, находящийся ориентировочно на 1710 строке

FOR k IN (SELECT *
FROM sqlt$_gv$sql_plan
WHERE ((hash_value = sql_rec.hash_value AND address = sql_rec.address) or sql_id = sql_rec.sql_id)
AND child_number = j.child_number
ORDER BY id)

на такой вариант:

FOR k IN (SELECT inst_id, address, hash_value, sql_id, plan_hash_value, child_address, child_number, timestamp, operation, options, object_node, object#, object_owner, object_name, object_alias, object_type, optimizer, id, parent_id, depth, position, search_columns, cost, cardinality, bytes, other_tag, partition_start, partition_stop, partition_id, other, distribution, cpu_cost, io_cost, temp_space, access_predicates, filter_predicates, projection, time, qblock_name, remarks, other_xml
FROM sqlt$_gv$sql_plan
WHERE hash_value = sql_rec.hash_value AND address = sql_rec.address
AND child_number = j.child_number
union all
SELECT inst_id, address, hash_value, sql_id, plan_hash_value, child_address, child_number, timestamp, operation, options, object_node, object#, object_owner, object_name, object_alias, object_type, optimizer, id, parent_id, depth, position, search_columns, cost, cardinality, bytes, other_tag, partition_start, partition_stop, partition_id, other, distribution, cpu_cost, io_cost, temp_space, access_predicates, filter_predicates, projection, time, qblock_name, remarks, other_xml
FROM sqlt$_gv$sql_plan
WHERE sql_id = sql_rec.sql_id
AND child_number = j.child_number
ORDER BY id)

No comments: