首页 > 解决方案 > 30个线程的Nifi executeSql非常慢

问题描述

我们正在使用 HDF 从 oracle 获取大量数据。我们有一个 generateTableFetch 来创建 8000 条记录的分区,这些记录创建如下查询:

Select * from ( Select a.*, ROWNUM rnum FROM (SELECT * FROM OPUSER.DEPENDENCY_TYPES WHERE (1=1))a WHERE ROWNUM <= 368000) WHERE rnum > 361000

现在这个查询需要将近 20-25 分钟才能从 oracle 返回。

我们做错了什么或者我们可以做的任何配置更改。

Nifi 使用 jdbc 连接,因此是否有任何 oracle 端配置。

此外,如果我们以某种方式向查询示例 / parallel(c,2) /添加并行提示。这会有帮助吗?

标签: oracleapache-nifi

解决方案


我猜您使用的是 Oracle 11(或更低版本)并已选择Oracle数据库类型。由于 LIMIT/OFFSET 直到 Oracle 12 才引入,NiFi 使用带有 ROWNUM 的嵌套 SELECT 方法来确保数据的每个“页面”都包含唯一值。如果您使用的是 Oracle 12+,请确保改用Oracle 12+数据库适配器,因为它可以利用 LIMIT/OFFSET 功能,从而加快查询速度。还要确保您有适当的索引来帮助执行查询。

从 NiFi 1.7.0 开始,您还可以考虑设置该Column for Value Partitioning属性。如果您有一个DEPENDENCY_TYPES分布相当均匀的列(可能是您的列),并且相对于您的Partition Size属性值不是“太稀疏”,GenerateTableFetch 可以使用列的值而不是 ROWNUM 方法,从而加快查询速度。有关更多详细信息,请参阅NIFI-5143和 GenerateTableFetch 文档。

如果您需要向 JDBC 会话添加提示,那么从 NiFi 1.9.0 开始(有关更多详细信息,请参阅NIFI-5780),您可以将查询前和查询后语句添加到 ExecuteSQL。


推荐阅读