14 авг. 2008 г.

Трассировка SQL

(C) Кощеев Артем.
Оригинал на http://www.sap-easy.net.ru/trc.htm
==========================================

Трассировка SQL

В данном разделе я попытаюсь рассказать о самом, на мой взгляд, полезном инструменте системы SAP R/3 - это "Трасировка SQL". При помощи данного инструмента вы сможете легко получить информацию о всех произведенных вами запросах к БД за время измерения. При этом вы получаете возможность оценить каждый запрос, увидеть код возврата (т.е. узнать о исходе запроса), просмотреть код программы инициирующей данный запрос.

Данная утилита важна при желании узнать таблицы в которые записываются данные при работе стандартных транзакций.



Итак, приступим...

Для проведения измерений я приготовил программу со следующим ABAP-кодом

REPORT ZFM_ART_TEMP1 .

TABLES: BSEG.

SELECT SINGLE * FROM BSEG
WHERE BUKRS = 'MAGN'
AND GJAHR = '2002'
AND BELNR = '5100000010'
AND BUZEI = 1.


WRITE:/ BSEG-BELNR, BSEG-HKONT.

Если вы не первый раз видите код написанный на АВАР, то вы поймете что данная программа выбирает из таблицы BSEG (позиции бух. документа) одну запись и выводит её на экран.

Перед запуском программы включим трассировку (транзакция ST05).



Для этого нужно установить флажок "SQL Trace" (он установлен по умолчанию) и нажать кнопку "Trace on". После запуска трассировки запускаем свою программу, выключаем трассировку и выводим список (кнопки "Trace off" и "List trace") Перед выводом списка на экран, перед вами появится окно в котором я думаю вы без труда разберетесь, здесь можно ограничить перечень выводимых объектов и сделать другие настройки выводимого списка. По умолчанию в окне указывается диапазон времени последней трассировки, но вы можете задать и другой. Единственное что я еще должен упомянуть по этому поводу - данные трассировки хранятся в кольцевом буфере, а это значит, что при слишком большой выборке у вас будет происходить перезапись буфера.

При этом получается следующая картина



В данном окне мы видим все операции с базой данных за время измерения, при этом, как вы видите, они представлены не в OpenSQL, а в NativeSQL. И вы понимаете что наш запрос

SELECT SINGLE * FROM BSEG
WHERE BUKRS = 'MAGN'
AND GJAHR = '2002'
AND BELNR = '5100000010'
AND BUZEI = 1.

на самом деле будет запросом к кластеру RFBLG.

Итак вы видите следующие данные

Duration - время операции в милисекундах

Object - объект (таблица)

DB op. - операция с БД

Четвертый столбик (в 4.6 обозначен как REC) - количество выбранных записей

Пятый столбик - код возврата.

SQL statement - я думаю не нужно объяснять

Теперь посмотрим, что интересного можно извлечь из всей этой красоты.

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

- информация об объекте словаря, тоже моно просто два раза кликнуть по полю с объектом.

- после нажатия этой кнопки перед вами откроется следующая картина





Верхний рисунок отображает структуру нашего запроса, а нижний - его полную детализацию.

Первый раздел детализации описывает технические данные запроса, второй - время выполнения составных частей запроса.

Для описания других разделов я изменю программу и сделаю выборку из таблицы BSAK (она не кластерная и будет намного нагляднее показать именно её)

REPORT ZFM_ART_TEMP1 .

TABLES: BSAK.

SELECT SINGLE * FROM BSAK
WHERE BUKRS = 'MAGN'
AND GJAHR = '2002'
AND BELNR = '5100000011'.

WRITE:/ BSAK-BELNR, BSAK-HKONT.

Из всех разделов более всего (на мой взгляд) полезны предпоследний и последний.

Предпоследний показывает аргументы запроса, а последний информацию о том как этот запрос отработал - какой при этом использовался индекс, какие индексы брались во внимание оптимизатором.

Посмотрев на данный рисунок вы без труда поймете, что при выборке использовался индекс "Z01" с полями MANDT, BUKRS, BELNR, GJAHR и BUZEI. Это пользовательский индекс, я его создавал сам, для оптимизации запросов по документам.



на этом рисунке

R3TSMDATA/BSAK+Z01 - индекс "Z01"
R3TSMDATA/BSAK+1 - "1"
R3TSMDATA/"BSAK+0" - "0", первичный индекс
R3TSMDATA/BSAK+Z02 - "Z02", тоже созданный мной индекс.

Следующая возможность заложенная в трассировку SQL - это просмотр ABAP-кода. Для просмотра части программы, вызвавшей запрос, нужно отметить этот запрос на экране и нажать кнопку


И последний пункт, о котором я расскажу - расширенный вывод

При нажатии этой кнопки перед вами просто появится расширенный список Трассировки SQL.

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