在 iUAP DI 中提高数据库性能
在 典型的数据仓库场景下,使用 iUAP DI 可以从各种数据库 读取 和写入数据。在 大多数 情况下,都是使用数据库的 JDBC 驱动 完成 这个工作。所以 在 读写数据库操作时都要通过中间的 JDBC 抽象层 , 下面 我们分析 一下读写数据库的详细过程 。
如果 步骤中指定了数据库连接,通常是选择一个数据库连接名。 这样 步骤就可以找到数据库的元信息 。 在 转换运行时 ,在步骤的 初始化 阶段会建立数据库连接。如果 所有使用 数据库的步骤 都可以 成功的建立数据库连接,转换就开始运行, 这时 就可以向数据库中读写数据。 需要 说明的是每个步骤都会建立一个独立的数据库连接。
下面从 DI 对数据的操作和数据库本身两方面优化阐述 :
一、 处理 数据的往返操作
当 SQL 语句和参数值被传到数据库,数据库就会返回执行 SQL 语句,并返回结果。这样 就 产生了一个往返过程。所以 和数据 相关的 DI 步骤 严重依赖这种往返操作 的 速度。而这种 往返 操作速度取决与网络 速度 、网络延迟 和 数据库性能。
1 ) 网络速度
网络 的速度也就是 带宽 ,会影响性能 , 尤其有很多数据需要通过网络来处理时,网络的带宽就更加重要了。象 “表输出 ” 和 “ 插入 更新 ” 步骤加载 数据库,要通过网络交换大量的数据。
你可能 对网络的性能无能为力 。 但是 , 可以在加载数据之前,把数据移动到和数据库尽可能近的地方。 “ 一辆装满 硬盘 在 高速公路上奔驰的大货车的带宽是无可比拟的 ” 。 换句话 说 , 对于 一些慢速网路,可以使用一些非常规手段,比如 把 数据放到一个磁盘和 或 光盘上,使用快递邮送过来。
2 ) 网络 延迟
运行 DI 的 计算机 和数据库服务器 , 网路距离越远网络延迟越大,导致性能差异就会巨大。对于 网络 延迟有时无能为力 , 可以试试其他解决的办法。首先 ,看 能否减少对数据库 操作 的往返次数,例如:在 “ 数据库 查询 ” 步骤 中使用缓存可以有效的减少 对 数据库的操作。 其次 , 使用 批量处理,在 “ 表输出 ” 中 选中 ” 使用 批量插入 “ 选项, 把数据行 放到 大的批量提交数据块里,可以减少数据库的往返操作次数。
二、 关系 型数据库的操作
数据 库本身的性能对转换的性能也起着重要作用,下面是一些通用的调优规则:
1 ) 批量 提交 大小
在 支持批量提交的步骤中,可以根据使用数据库的不同,可以尽量将提交数设置的 大些 ,但如果设置的过大就会占用过多的数据库的重做表空间,反而 使 性能会降低, 一般 来说 ” 提交记录 数量 ” 设置 为 5000 较为 合适,如果数据性能较高且重做表空间设置也比较大可以设置更大些。
2 ) 索引
在 做查询和数据表连接时,表中引入索引是 至关重要 的。在 ” 数据库 查询 “ 和 ” 维度 更新 “ 中 应对关键字段增加索引。但 索引 会使数据库的的更新、插入、删除操作较慢。在 关系 型数据库中创建的索引越多,这些操作就会越慢,因为这些原因,在做大规模 操作时 ,如数据初始化,批量更新等操作,可以先删除索引,然后再做完这些大规模操作 后 再创建索引,会更节省时间。
3 ) 表分区
对于 大表数据可以考虑使用数据表分区,分区可以按照时间,也可以按照 Hash 值等,但无论分区 按照 哪种逻辑,都应该让数据库能快速知道一条记录在哪个分区里 。 这样 在使用 索引前,就会所限查询范围,相应提高查询性能。
4 ) 约束 和触发器
数据仓库 中有 约束 和触发器会降低数据库的 性能 ,因为每次 DML 操作 都要 验证约束和执行触发器, 所以 在数据仓库中要尽可能少使用约束,不要使用触发器。
5 ) 数据库 日志
通常 对关系型数据库的 DML 操作都会写日志,对于数据库仓库日志没有 OLTP 那么重要,可以考虑修改设置, 使 尽可能少输出日志 。例如 :在 Oracle 中 通过 alter table < table_name > nologging; 可以 大幅减少 该表 的日志输出,从而提高效率。