DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Неполные данные рекурсивного SQL


Включение и отключение трассировки SQL из стороннего сеанса так­же может привести к усечению данных трассировки, необходимых для определения природы рекурсивных отношений в SQL. Включение трассировки SQL после выполнения рекурсивных операций, но до за­вершения соответствующих родительских операций, приводит к от­сутствию данных о потомках в файле трассировки. Например, если выполняется приведенный ниже код PL/SQL, то полученный файл трассировки будет отображать ряд рекурсивных отношений между различными элементами блока и самим блоком:
alter session set events '10046 trace name context forever, level 8'; declare
cursor lc is select count(*) from sys.source$; cnt number; begin
open lc;
fetch lc into cnt; close lc; open lc;
fetch lc into cnt; close lc;
end; /
Однако можно коренным образом изменить данные трассировки, убрав команду ALTER SESSION и включив трассировку из стороннего сеанса (на­пример, при помощи DBMS_SUPPORT. START_TRACE_IN_SESSION) в ходе выпол­нения блока. Сделав так, вы обнаружите, что ядро опустит массу све­дений для всех рекурсивных дочерних операций, выполнение кото­рых началось прежде, чем была включена трассировка. Включение трассировки SQL из стороннего сеанса может привести к отсутствию в файле трассировки дочерних вызовов базы данных для всех рекур­сивных родительских операций, перечисленных в файле трассировки.
Как и в рассмотренном ранее случае с отсутствием данных о вызовах базы данных при включении трассировки, лучшим лекарством от по­добной ошибки сбора данных является ее предотвращение. Все долж­но получиться естественным образом, если сбор данных основывается на пользовательских действиях, как это и должно быть. Однако, даже если нажать кнопку «запуска трассировки» с небольшим опозданием, полученная ошибка сбора данных не так страшна, как описанная вы­ше ошибка с прерыванием вызова базы данных. Несмотря на отсутст­вие деталей, способных пояснить вам, почему сеанс израсходовал именно столько времени, наличие данных о родительских вызовах ба­зы данных обычно позволяет провести анализ.
Аналогично отключение трассировки SQL из стороннего сеанса озна­чает возможность отсутствия в файле трассировки родительских вы­зовов базы данных для всех рекурсивных (dep > 0) операций, отмечен­ных в файле трассировки. Представьте себе, что в примере 6.11 трас­сировка уже была включена на момент начала приведенного фрагмен­та кода, а затем была выключена сторонним сеансом в момент, помеченный значком О. Результат такой трассировки показан в при­мере 6.12.
В примере 6.11 очевидно наличие рекурсивных отношений между вызо­вами базы данных, т. к. в нем присутствуют три операции со значени­ем глубины dep=1 (они выделены жирным шрифтом в примерах 6.11 и 6.12). Проблема примера 6.12 в том, что трассировка была отключе­на прежде, чем ядро Oracle передало какие-либо сведения о рекурсив­ном родителе глубины dep=0 для наших операций. Обратите внимание на операцию глубины dep=0 в примере 6.11 (она также выделена жир­ным шрифтом), которая и служит родителем, но в примере 6.12 трас­сировка была завершена прежде, чем информация о родителе попала в файл трассировки.
Пример 6.12. В конце этого файла трассировки нет вызова базы данных, который бы следовал за событиями глубины dep=1, выступая как их родитель
Из усеченных данных примера 6.12 можно узнать о том, что присутст­вуют три рекурсивных операции SQL, для которых где-то существует родитель, но кто он - неизвестно. Такие вызовы базы данных остаются «сиротами». Отключение трассировки SQL из стороннего сеанса при­водит к возможному отсутствию в файле трассировки родительских вызовов базы данных для всех рекурсивных (dep > 0) операций, упо­мянутых в этом файле
И вновь лучшее лекарство - это профилактика. Вы естественным обра­зом избежите таких ошибок, если будете выбирать время остановки сбо­ра данных, основываясь на наблюдениях за пользовательскими опера­циями, как это и должно быть.

 









jAntivirus