优化关系数据库查询的性能

许多客户都遇到数据仓库应用程序的性能问题。在某些情况下,Oracle Analytics 生成的 SQL 查询比较复杂,无法进行分析。本主题提供了一些准则,说明如何分析和最大程度减少可能由 Oracle Analytics 生成的 SQL 查询引起的性能问题。

本主题未涵盖因网络、浏览器或报表演示问题导致的性能问题。

分析 Oracle Analytics 的查询日志(需要使用日志级别 3)

有关如何查找此日志或了解相关内容的信息,请参见收集和分析查询日志

  1. 将在 Oracle Analytics 中进行查询所用时间与在数据库中进行相同查询所用时间进行比较,即响应时间与物理查询持续时间。通常,在 Oracle Analytics 中所用时间不会超过几秒。
  2. 如果响应时间超过几秒,则分析在 Oracle Analytics 中执行的各个步骤来查找原因(需要使用日志级别 5)。

分析物理 SQL 查询

  1. 检查查询中包含的所有表是否都是必要的。查找已联接但未包含在 SELECT 子句中并且未应用任何筛选器(真正的筛选器,不是联接条件)的表。
  2. 确定生成的物理查询和子查询数量。更准确地说,查询读取多少次事实表?理想情况下,查询读取单个事实表且只读取一次。如果存在多个事实表,请查明原因并看看是否可以删除一些。
  3. 检查排除的列、非相加聚合原则 (REPORT_AGGREGATE, count(distinct)...)、选择步骤、报表中的子查询、设置运算符 (UNION)、总计、小计、多个视图等。
  4. 检查任何外部联接。查明它们源自何处以及是否可以通过更改设计删除一些。

分析执行计划

如果优化 SQL 查询不足以解决问题,则分析执行计划来查找性能问题的根本原因。请您的数据库管理员 (DBA) 帮助您。目前有四种提高性能的主要方式:
  1. 通过改进数据访问路径(索引)来减少输入输出调用量。
  2. 通过减少读取的数据量来减少输入输出调用量。例如,您可以检查应用的筛选器或数据模型结构(参见下一节)。
  3. 提高并行度(用于读取大型表的线程数)。
  4. 提高输入输出调用速度(基础结构改进、内存中数据库等)。

查看并改进数据模型以减少读取的数据量

  1. 创建聚合表。
  2. 使用碎片。

    例如,如果用户主要选择当前年、季度或月的数据,可以将事实拆分为两个表:当前和档案。还可以在 Oracle 数据库上使用分区。

  3. 使用反向规范化来减少联接数。
  4. 拆分表以减少列数。

    读取的数据量并不仅仅取决于每个表中的行数。表的量还取决于表中列的数量和大小。例如,您可以将一个包含 500 列的大表拆分为两个表;一个表中包含最常用的 50 列,另一个表中包含很少使用的其余 450 列。

Oracle Analytics 中的许多性能问题都源自设计不佳,因为这会导致生成的 SQL 查询不是最优的。您可以通过修改设计来改进 Oracle Analytics 生成的 SQL 查询。这不仅会对报表的性能而且还会对数据库中使用的资源量产生巨大影响。