使用 SQL 跟踪分析数据库访问

学习目标

  • 启动 SQL 跟踪。

  • 分析 SQL 跟踪结果。

SQL 跟踪

SQL 跟踪用于集中监控 ABAP 系统和数据库之间的整个流量。您可以从内部 ABAP 开发工具中激活和取消激活跟踪。但要分析跟踪结果,必须启动技术监控器主控室,即基于浏览器的应用程序。

SQL 跟踪不限于单个用户、客户端或服务器实例。如果有多个数据库连接到系统,则会跟踪所有这些数据库的流量。

在跟踪结果中,可以显示有关单个 SQL 语句的信息,例如数据库中的时间消耗或访问的记录数。您还可以分析本地 SQL 语法,即到达数据库的形式的语句。

使用 SQL 跟踪时,存在一些限制。只有一个用户可以同时打开跟踪。从 ABAP 开发工具激活跟踪时,无法添加记录过滤器。

SQL 跟踪结果

在本视频中,您将了解如何启动 SQL 跟踪并分析结果。

视频:本节含 SAP 官方视频(视频 ID 1_hn7i1tvf),需在 learning.sap.com 在线观看。

使用 SQL 跟踪工具

通过分析 ABAP 代码,您发现访问数据库是总体运行时的主要因素。现在,您将使用 SQL 跟踪工具更详细地分析程序的数据库访问,并进一步提高代码的性能。

模板:

  • /LRN/CL_S4D401_ATS_PROFILING(全局类)

解决方案:

  • /LRN/CL_S4D401_ATS_SQL_TRACE(全局类)

任务 1: 复制模板(可选)

复制模板类 /LRN/CL_S4D401_ATS_PROFILING。如果已完成上一练习,则可以跳过此任务并继续编辑类 ZCL_##_SOLUTION

步骤

  1. 将类 /LRN/CL_S4D401_ATS_PROFILING 复制到您自己的包中的类(建议名称:ZCL_##_SOLUTION,其中 ## 代表组编号)。

  2. 在项目浏览器中,右键单击类 /LRN/CL_S4D401_ATS_PROFILING 以打开上下文菜单。

  3. 从上下文菜单中,选择复制....

  4. 在包字段中输入的名称。在名称字段中,输入 ZCL_##_SOLUTION,其中 ## 代表组编号。

  5. 选择下一步

  6. 确认传输请求并选择完成

  7. 激活复制。

  8. Ctrl + F3 激活类。

任务 2: 执行 SQL 跟踪

要进一步分析性能问题,请激活 SQL 跟踪并将 ABAP 类 ZCL_##_SOLUTION 作为控制台应用执行。

在同一 ABAP 实例中,一次只能有一个用户打开 SQL 跟踪。要让其他用户获得机会,请在完成控制台应用程序运行后关闭 SQL 跟踪。

步骤

  1. 如果未打开,请在编辑器中打开 ABAP 类 ZCL_##_SOLUTION

  2. Ctrl + Shift + A 并输入 ABAP 类的名称。

  3. 选择确定

  4. 打开 ABAP 云项目的 SQL 跟踪状态对话框。

  5. 在左侧的项目资源管理器中,右键单击项目以打开上下文菜单。

  6. 选择 SQL 跟踪 ....

  7. 检查当前 SQL 跟踪状态。如果打开跟踪,请关闭对话框窗口并在几分钟后返回。

  8. 选择确定关闭对话窗口。

  9. 如果跟踪当前已关闭,请将其打开。然后关闭对话框窗口。

  10. 选择激活打开 SQL 跟踪。

  11. 选择确定关闭对话窗口。

  12. 执行全局类 ZCL_##_SOLUTION 作为控制台应用。

  13. F9 将 ABAP 类作为控制台应用执行。

  14. 应用程序完成后,关闭 SQL 跟踪并打开跟踪目录。

  15. 右下角的绿色进度标识消失后,右键单击项目浏览器中的项目,然后选择 SQL 跟踪 ....

  16. 选择取消激活以关闭 SQL 跟踪。

  17. 选择查看跟踪目录以显示跟踪列表。

任务 3: 分析跟踪结果

分析 SQL 跟踪结果。过滤源自 ABAP 类的数据库访问,并找出访问数据库表的频率。

步骤

  1. 在技术监控主控室中,显示最新跟踪的跟踪记录。

提示

缺省情况下,跟踪列表按时戳列降序排序。

  1. 选择最顶层列表条目。

  2. 选择*"跟踪记录"*。

  3. 过滤跟踪记录列表。仅显示源自 ABAP 类 ZCL_##_SOLUTION 的记录。

提示

我们建议您使用执行按钮左侧的过滤器选项,而不是通过选择程序列标题可设置的显示过滤器。

  1. 在表的工具栏中,在"执行"按钮的左侧,选择"*过滤器"(...)*选项。

  2. 从对话框窗口顶部的下拉列表中选择程序

  3. 确保已选择"点赞"选项。

  4. 将提示输入值替换为 ABAP 类的名称 (ZCL_##_SOLUTION)。

  5. 选择确定

  6. 选择执行以更新表条目。

  7. 对跟踪记录列表进行排序。查找访问次数最多的 SQL 语句。

注意

缺省情况下,跟踪记录的列表按时戳列排序。要更改排序,必须先移除现有排序。

  1. 选择执行按钮右侧的三个水平点。

  2. 选择重置排序

  3. 在表的工具栏中,在"执行"按钮的左侧选择"排序"(0) 选项。

  4. 查找访问记录 [#] 列。勾选左侧的框,然后选择此列的降序排序按钮。

  5. 选择确定关闭对话窗口。

  6. 选择执行

  7. 移除按访问记录列的排序,并按持续时间列对清单进行降序排序。

  8. 选择执行按钮右侧的三个水平点。

  9. 选择重置排序

  10. 在表的工具栏中,在"执行"按钮的左侧选择"排序"(0) 选项。

  11. 查找持续时间 [µs] 列。勾选左侧的框,然后选择此列的降序排序按钮。

  12. 选择确定关闭对话窗口。

  13. 选择执行

  14. 对于最消耗资源的单个记录语句,导航到 SQL 语句部分。

  15. 选择 已访问记录 列中值为 1 的行和 持续时间 列中的最大值。

  16. 从顶部的导航窗格中选择*"SQL 语句*"。

  17. 您可以在 FROM 子句中找到表名。

  18. 在 ABAP 开发工具中打开 SELECT 语句。

  19. 选择在 ADT 中显示 ABAP 源

任务 4: 改进代码

要进一步提高代码的性能,请消除对数据库表 /LRN/CONNECTION 的重复 SELECT SINGLE 访问。您知道表 /LRN/CONNECTION 包含相对较少的记录。因此,您决定在静态属性中缓冲数据库表的全部内容(建议名称:connections_buffer)。在静态构造函数(方法 class_constructor)中填充缓冲区,并使用对缓冲区的读取访问替换 SELECT SINGLE 语句。

提示

对数据库表 /LRN/CONNECTION 的 SELECT SINGLE 访问位于本地类 lcl_passenger_flight 的构造函数方法中。

步骤

  1. 导航到属性 connection_details 的定义并从此处导航到结构类型 st_connection_details 的定义。

  2. 在 SELECT SINGLE 语句的 INTO 子句中,将光标置于 connection_details 上,然后按 F3。或者,可以按住 Ctrl 键并单击 connection_details

  3. 在 DATA 语句中,将光标放在 st_connection_details 上,然后按 F3。或者,可以按住 Ctrl 键并单击 st_connection_details

  4. 将结构类型 st_connection_details 复制到新的专用结构类型(建议名称:st_connections_buffer)。

  5. 选择整个 TYPES 语句(包括行 END OF st_connection_details.)并按 Ctrl + C

  6. 向下滚动至专用部分,将光标放在 ENDCLASS 语句上方,然后按 Ctrl + V 插入复制的代码。

  7. 在插入的代码中,将 st_connection_details 替换为 st_connections_buffer

  8. 将数据库表 /LRN/CONNECTION 中的关键字段 carrier_idconnection_id 添加到 st_connections_buffer 组件列表的开头。

  9. 如下调整代码:

TYPES:
BEGIN OF st_connections_buffer,
carrier_id      TYPE /dmo/carrier_id,
connection_id   TYPE /dmo/connection_id,
airport_from_id TYPE /dmo/airport_from_id,
airport_to_id   TYPE /dmo/airport_to_id,
departure_time  TYPE /dmo/flight_departure_time,
arrival_time    TYPE /dmo/flight_arrival_time,
END OF st_connections_buffer.
  1. 将名为 connections_buffer 的专用静态属性声明为内部表,并将 st_connections_buffer 作为行类型。

  2. 在类定义末尾,添加以下代码:

CLASS-DATA connections_buffer TYPE TABLE OF st_connections_buffer.
  1. 使用快速修复为类 lcl_passenger_flight 生成静态构造函数(类构造函数)。

  2. 向上滚动到语句 CLASS lcl_passenger_flight DEFINITION

  3. 将光标置于 lcl_passenger_flight 上,然后按 Ctrl + 1 显示可用快速修复的列表。

  4. 从列表中选择"生成类构造函数"

  5. 编辑方法 class_constructor 的实施。实施一个 SELECT 语句,该语句将数据库表 /LRN/CONNECTION 中的所有记录读取到 connections_buffer 属性中。

  6. 如下调整代码:

METHOD class_constructor.
SELECT
FROM /lrn/connection
FIELDS carrier_id, connection_id,
airport_from_id, airport_to_id, departure_time, arrival_time
INTO TABLE @connections_buffer.
ENDMETHOD.
  1. 在方法**构造函数的**实现中,将 SELECT SINGLE 语句替换为对 connections_buffer 的读取访问权限。

注意

请记住,属性 connection_details 的组件少于 connections_buffer 属性的行类型。

  1. 选择整个 SELECT SINGLE 语句,然后选择 Ctrl + < 在每行前添加注释符号。

  2. 在注释后的 SELECT SINGLE 语句后,添加以下代码:

*  SELECT SINGLE
*    FROM /lrn/connection
*    FIELDS airport_from_id, airport_to_id,
*           departure_time, arrival_time
*    WHERE carrier_id    = @carrier_id
*      AND connection_id = @connection_id
*    INTO @connection_details.
connection_details = CORRESPONDING #(
connections_buffer[
carrier_id    = i_carrier_id
connection_id = i_connection_id ]
).

任务 5: 重新检查代码

激活并测试全局类。以控制台应用形式执行类。重复剖析以测量性能改进。

步骤

  1. 激活全局类并将其作为控制台应用执行。

  2. Ctrl + F3 激活类。

  3. F9 以控制台应用身份执行类。

  4. 使用 ABAP 分析器启动运行时测量。

  5. 右键单击编辑器并选择参数文件作为ABAP 应用程序(控制台)

  6. 跟踪参数对话框中,选择完成而不更改任何设置。

  7. 切换到剖析器透视图并分析跟踪概览。

  8. 选择 窗口透视图打开透视图其他... 。选择 ABAP 概要分析,然后选择打开

  9. ABAP 跟踪视图中,从 ABAP 项目的上下文菜单中选择刷新。或者,可以将光标置于 ABAP 跟踪视图中的任意位置,然后按 F5 重新加载跟踪结果列表。

  10. 双击最新的跟踪(这是项目下的最顶层条目)。

  11. 总体运行时和 ABAP数据库之间的分配显示在 概览 的下半部分。