本教程将介绍如何使用 SQL Performance Analyzer 主动调优 SQL。
大约 40 分钟
本教程讨论以下主题:
| 概述 | ||
| 前提条件 | ||
| 设置环境 | ||
| 执行导向工作流 | ||
| 运行 SQL Tuning Advisor | ||
| 比较重放试验和调优的 SQL | ||
| 模拟 Exadata 的使用 | ||
| 清理 | ||
| 总结 | ||
将光标置于此图标上可以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)
注:此外,您还可以在下列步骤中将光标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图将其隐藏。
SQL Performance Analyzer 可用于预测和防止由于数据库环境改变影响了 SQL 执行计划的结构而引起的潜在性能问题。这些改变包括(但不限于):
DBA 即使在最复杂的环境中也可以使用 SQL Performance Analyzer 预测由于上述更改引起的 SQL 性能变化(执行计划、统计信息)。由于应用程序在开发生命周期中不断演变,因此数据库应用程序开发人员可以测试模式、数据库对象、重写应用程序等的更改,以减少潜在的性能影响。
利用 SQL Performance Analyzer 还可以比较 SQL 性能统计信息。
在本教程中,您将创建一个任务来比较应用补丁之前和之后的 SQL 负载的性能。任何由于补丁应用程序引起的 SQL 性能下降都可以使用 SQL Tuning Advisor 来调优,这将确保系统上的 SQL 负载得到真正改善。最后,您将模拟 Exadata 存储服务器的使用来确定其对负载的可能影响。
开始学习本教程之前,您应该先完成以下步骤:
| 1. | 安装 Oracle Database 11g。 |
|
| 2. | 将 spa.zip 下载并解压缩到您的工作目录中。 |
|
首先,您需要设置 SQL Performance Analyzer 将使用的环境。执行以下步骤:
| 1. | 打开一个终端窗口,从 SQL 文件所在的目录执行以下命令。setup_demo.sh 脚本将创建相应的数据库对象并加载将在本教程中使用的数据。运行此脚本可能需要几分钟。 cd <your working directory>/spa ./setup_demo.sh
|
| 2. | 现在,您可以运行 run_workload_50q.sh 脚本,针对您刚刚加载的数据生成一些负载。执行以下脚本: ./run_workload_50q.sh 2 注:“2”指明脚本中将执行的查询次数。运行此脚本可能需要几分钟。
|
| 3. | 您还需要运行 create_sts.sql 脚本,为您刚运行的负载创建一个 SQL 调优集。执行以下命令: sqlplus apps/apps @create_sts
|
导向工作流创建一个 SQL Performance Analyzer 任务,并使用手动创建的重放试验执行一些自定义试验。在本示例中,您刚刚安装了一个新的补丁集并且希望看到是否有性能下降的 SQL。执行以下步骤:
| 1. | 打开一个浏览器,输入以下 URL: http://<hostname>:1158/em 输入 system 作为用户名,指定口令,然后单击 Login。
|
| 2. | 单击 Software and Support 选项卡。
|
| 3. |
选择 Real Application Testing 下方的 SQL Performance Analyzer。
|
| 4. | 选择 SQL Performance Analyzer Workflows 下方的 Guided Workflow。
|
| 5. |
您要执行的第一项任务是基于 SQL 调优集创建一个 SQL Performance Analyzer 任务。单击该任务的 Execute 图标。
|
| 6. | 为 Name 输入 OBE1,然后单击 SQL Tuning Set 的手电筒图标。
|
| 7. |
选择 HR_WORKLOAD SQL 调优集,然后单击 Select。
|
| 8. |
单击 Create 创建 SQL Performance Analyzer 任务。
|
| 9. | 现在,您可以为最初的环境创建 SQL 调优集的重放,这将创建一个您更改后与其进行比较的基准。单击导向工作流中第二个步骤的 Execute 图标。当您重放 STS 时,STS 中的 SQL 根据环境一次测试执行一个,不需要重新运行应用程序。
|
| 10. | 为 Name 输入 OBE_BEFORE_CHANGE,选中 Trial environment established 复选框,然后单击 Submit。
|
| 11. |
作业运行。单击 Refresh 几次,直至作业完成。作业运行可能需要一两分钟。
|
| 12. | 当显示绿色对号时,您的作业已完成。
|
| 13. | 现在,您需要进行更改。这是在我们的情景中您将应用补丁集的地方。切换到终端窗口,执行 make_changes.sh 脚本: ./make_changes.sh
|
| 14. | 现在,您可以通过应用的补丁集重放 SQL 调优集以便执行比较。单击导向工作流中第三个步骤的 Execute 图标。
|
| 15. | 为 Name 输入 OBE_AFTER_CHANGE,选中 Trial environment established 复选框,然后单击 Submit。
|
| 16. | 作业运行。单击 Refresh 几次,直至作业完成。现在,您可以比较两个重放作业了。单击导向工作流中第四个步骤的 Execute 图标。
|
17. |
确保 Trial Name 1 设置为 OBE_BEFORE_CHANGE,Trial Name 2 设置为 OBE_AFTER_CHANGE。选择 Buffer Gets 作为 Comparison Metric,然后单击 Submit。
|
18. |
当第四个任务完成时,单击第五个步骤的 Execute 图标,查看比较报告。
|
19. |
通过应用补丁集,大多数 SQL 都有改进,但是您会体验到轻微的性能下降。单击 Regression 的条形图。
|
20. |
有四个 SQL 语句需要进一步检查。单击路径式导航栏,返回前一个窗口。
|
您可以针对任何在导向工作流中性能下降的 SQL 运行 SQL Tuning Advisor。执行以下步骤:
| 1. | 在 SQL Performance Analyzer Task Report 页面中,单击 Run SQL Tuning Advisor。
|
| 2. | 为 Tuning Task Name 输入 OBE_TUNE_REGRESSED_SQL,单击 OK。
|
| 3. | 您的调优任务已成功创建。单击 Advisor Central 路径式导航栏。
|
| 4. | 直至等到作业完成。这可能需要几分钟的时间。作业完成后,单击 OBE_TUNE_REGRESSED_SQL 链接。
|
| 5. | SQL Tuning Result Summary 页面显示已经检查了 4 条 SQL 语句,还显示已经发现了为每条语句推荐的 SQL Profile。单击 Show all results 查看有关这些发现的详细信息。
|
| 6. | 您将看到为每条 SQL 语句都推荐了一个 SQL Profile。单击 Implement All SQL Profiles。
|
| 7. | 要确认实施,单击 Yes。
|
| 8. | SQL Profile 创建完毕。单击 Advisor Central 路径式导航栏。
|
现在,您可以比较重放试验和调优后的 SQL,查看是否有任何性能下降。执行以下步骤:
| 1. | 选择 SQL Performance Analyzer 链接。
|
| 2. | 选择 SQL Performance Analyzer Tasks 下方的 OBE1 链接。
|
| 3. | 单击 Replay Trials 下方的 Create SQL Trial。
|
| 4. | 输入 OBE_AFTER_TUNE_REGRESSED_SQL 作为名称,单击 Trial environment established 复选框,然后单击 Submit。
|
| 5. | SQL 重放作业已成功创建。单击 Refresh 直至作业完成。现在,您可以运行 OBE_BEFORE_CHANGE 试验和 OBE_AFTER_TUNE_REGRESSED_SQL 试验两者的比较报告。单击 Run SQL Trial Comparison。
|
| 6. | 为 Trial 1 Name 选择 OBE_BEFORE_CHANGE,为 Trial 2 Name 选择 OBE_AFTER_TUNE_REGRESSED_SQL。为 Comparison Metric 选择 Buffer Gets,单击 Submit。
|
| 7. | 比较创建完毕。单击新建的 Comparison Report 的眼镜图标。
|
| 8. | 注意,此时没有任何性能下降。因此,使用调优的 SQL 可以安全地应用补丁集,因为这会产生 87% 的性能提高。
|
Oracle Exadata 提供能识别数据库操作的存储服务,例如,能够将数据库处理从数据库服务器卸载到存储设备,同时对 SQL 处理和数据库应用程序透明。11g 第 2 版中新增的 SQL Performance Analyzer 特性能够模拟与您的负载结合使用 Exadata 时的效果。通过 Oracle 数据库与 Exadata 的紧密集成,可以在没有实际 Exadata 存储服务器的情况下模拟 Exadata 的使用效果。要查看如何对负载执行 Exadata,执行以下步骤:
| 1. | 选择 SQL Performance Analyzer 链接。
|
| 2. | 使用终端窗口以用户 DBA 的身份启动一个 SQL*Plus 会话,然后执行 flush.sql 脚本清空各种 SGA 缓存。 sqlplus / as sysdba
|
| 3. | 返回 Enterprise Manager,单击 Exadata Simulation。
|
| 4. | 为 Task Name 输入 COMPARE_EXADATA,为 SQL Tuning Set 输入 APPS.HR_WORKLOAD,然后单击 Submit。
|
| 5. | 将执行 SQL Performance Analyzer 任务。单击 Refresh 查看该任务的进度,或者只是等待该任务完成。
|
| 6. | 该任务完成后,单击 COMPARE_EXADATA 链接。
|
| 7. | 您将看到已经执行了两个 SQL 试验,一个禁用了 Exadata 模拟,一个模拟了 Exadata 的使用。还可以看到一个比较这两个 SQL 试验的报告。单击新建的 Comparison Report 的眼镜图标。
|
| 8. | 这个比较报告表明,与该负载结合使用 Exadata 将大幅减少存储设备与数据库实例之间传送的数据量。
|
| 9. | 滚动到该页面的底部,单击 Top 10 SQL Statements Based on Impact on Workload 中的最后一条 SQL 语句。
|
| 10. | 单击 SQL Text 标签旁边的加号按钮。
|
| 11. | 现在,您可以看到该 SQL 语句的完整内容了。该语句联接了两个表,并且只返回具有特定属性值的记录。
|
| 12. | 向下滚动至 Plan Comparison 部分。在这里您可以看到,没有使用 Exadata,正在执行两个全表扫描 (TABLE ACCESS FULL)。在即席查询未定义支持查询的索引的数据仓储情况下,这是很常见的。使用 Exadata 时,您可以看到正在向 Exadata 存储服务器压入筛选谓词 (TABLE ACCESS STORAGE FULL)。结果是,只有满足筛选条件的行才返回给数据库服务器,这就意味着该语句的 I/O 互通字节大大减少了。
|
| 13. | 单击该页面顶部的 SQL Performance Analyzer Task Report 路径式导航栏,返回 Comparison Report。
|
| 14. | 您已经看到 Exadata 将如何针对该负载大幅减少从存储设备返回数据库服务器的信息量。这将使数据库服务器能更高效地处理负载,从而提升整体性能。
|
执行以下步骤清理您的环境:
| 1. | 切换回终端窗口,执行 reset_demo.sh 脚本。 ./reset_demo.sh |
| 2. | 此时,您可以再次执行此 OBE 教程。但是,这一次,您不需要执行“设置环境”主题中的第一个步骤。您可以从您运行负载的第二个步骤开始。 |
在本教程中,您学习了如何:
| 执行导向工作流 | ||
| 使用最初的环境重放 SQL 调优集 | ||
| 应用补丁,然后使用更改后的环境重放 SQL 调优集 | ||
| 比较重放以查看所有性能下降 | ||
| 运行 SQL Tuning advisor 以便对导致性能下降的 SQL 进行调优 | ||
| 比较重放试验和调优的 SQL,显示已不存在任何性能下降 | ||
| 模拟 Exadata 的使用 | ||
将鼠标移到该图标上可以隐藏所有屏幕截图