我们正在使用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) /中添加了并行提示。有帮助吗?
答案 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添加查询前和查询后的语句。