具有30个线程的Nifi executeSql非常慢

时间:2019-03-05 11:12:47

标签: oracle apache-nifi

我们正在使用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) /中添加了并行提示。有帮助吗?

1 个答案:

答案 0 :(得分:2)

我猜您正在使用Oracle 11(或更少),并且已选择Oracle作为数据库类型。由于直到Oracle 12才引入LIMIT / OFFSET,因此NiFi使用嵌套的SELECT和ROWNUM方法来确保数据的每个“页面”都包含唯一值。如果您使用的是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添加查询前和查询后的语句。