OpenCmis 查询比 apache cmis 慢 workbench
OpenCmis query slower than apache cmis workbench
我正在做非常简单的查询
SELECT cmis:objectId, cmis:name, cmis:parentId
FROM cmis:folder
ORDER BY cmis:name
运行 使用 apache cmis 的查询 workbench 大约需要 15 秒
运行 使用 opencmis 进行相同的查询,速度非常快,但处理结果非常慢 ~ 3 分钟。
session.query( queryStmt, false).iterator().toList()
像这样拆分调用
def rs = session.query( queryStmt, false)
def iterator = rs.iterator()
def folders = iterator.toList()
我能够确定 toList()
是速度较慢的地方。
但是我不明白为什么。
我还尝试定义一个 operationContext 并将其用于查询。
相同的结果。这是我的 operationContext
def filter = "cmis:objectId,cmis:name,cmis:parentId"
def context = session.createOperationContext()
context.setCacheEnabled(false)
context.setFilterString(filter)
context.setRenditionFilterString(filter)
知道如何更快地执行此查询吗?
默认情况下,CMIS Workbench 仅获取前 100 个匹配项。根据存储库,这通常很快。增加 "max hits" 以获得更多。
要复制 CMIS Workbench 正在执行的操作,请尝试以下代码片段:
String queryStmt = "SELECT cmis:objectId, cmis:name, cmis:parentId FROM cmis:folder ORDER BY cmis:name";
int maxHits = 100;
OperationContext context = session.createOperationContext();
context.setMaxItemsPerPage(maxHits);
session.query(queryStmt, false, context).getPage(maxHits).iterator().toList();
toList
迭代查询的所有结果。默认的 OperationContext 定义了 100 个命中的批次。也就是说,在引擎盖下 OpenCMIS 将对存储库进行多次(可能多次)查询调用,要求前 100 次命中,第二次 100 次命中,第三次 100 次命中,...
如果您的点击总数达到一百万,您最终会收到相当多的后端调用。
尝试使用 context.setMaxItemsPerPage(1000000)
增加批量大小。如果您有很多点击并希望将它们全部作为列表,这通常会更快。
当您循环使用它们并且不需要一次全部使用它们时,小批量更好。它还允许处理不适合客户端内存的结果集。
还有一个方面:
删除 ORDER BY
并稍后在 Java 中对列表进行排序。无论如何,你的结果集都在内存中。如果存储库在 cmis:name
上没有索引,它会减慢服务器端的查询处理速度。
感谢@Florian的帮助。
他解决了我的问题。
def context = session.createOperationContext()
context.includeAllowableActions = false
context.maxItemsPerPage = 15000
def folderList = session.query(getFoldersList, false, context).iterator().toList()
当然在现实生活中,每页的最大项目数不应该是这样的任意数字。
我正在做非常简单的查询
SELECT cmis:objectId, cmis:name, cmis:parentId
FROM cmis:folder
ORDER BY cmis:name
运行 使用 apache cmis 的查询 workbench 大约需要 15 秒 运行 使用 opencmis 进行相同的查询,速度非常快,但处理结果非常慢 ~ 3 分钟。
session.query( queryStmt, false).iterator().toList()
像这样拆分调用
def rs = session.query( queryStmt, false)
def iterator = rs.iterator()
def folders = iterator.toList()
我能够确定 toList()
是速度较慢的地方。
但是我不明白为什么。
我还尝试定义一个 operationContext 并将其用于查询。 相同的结果。这是我的 operationContext
def filter = "cmis:objectId,cmis:name,cmis:parentId"
def context = session.createOperationContext()
context.setCacheEnabled(false)
context.setFilterString(filter)
context.setRenditionFilterString(filter)
知道如何更快地执行此查询吗?
默认情况下,CMIS Workbench 仅获取前 100 个匹配项。根据存储库,这通常很快。增加 "max hits" 以获得更多。
要复制 CMIS Workbench 正在执行的操作,请尝试以下代码片段:
String queryStmt = "SELECT cmis:objectId, cmis:name, cmis:parentId FROM cmis:folder ORDER BY cmis:name";
int maxHits = 100;
OperationContext context = session.createOperationContext();
context.setMaxItemsPerPage(maxHits);
session.query(queryStmt, false, context).getPage(maxHits).iterator().toList();
toList
迭代查询的所有结果。默认的 OperationContext 定义了 100 个命中的批次。也就是说,在引擎盖下 OpenCMIS 将对存储库进行多次(可能多次)查询调用,要求前 100 次命中,第二次 100 次命中,第三次 100 次命中,...
如果您的点击总数达到一百万,您最终会收到相当多的后端调用。
尝试使用 context.setMaxItemsPerPage(1000000)
增加批量大小。如果您有很多点击并希望将它们全部作为列表,这通常会更快。
当您循环使用它们并且不需要一次全部使用它们时,小批量更好。它还允许处理不适合客户端内存的结果集。
还有一个方面:
删除 ORDER BY
并稍后在 Java 中对列表进行排序。无论如何,你的结果集都在内存中。如果存储库在 cmis:name
上没有索引,它会减慢服务器端的查询处理速度。
感谢@Florian的帮助。
他解决了我的问题。
def context = session.createOperationContext()
context.includeAllowableActions = false
context.maxItemsPerPage = 15000
def folderList = session.query(getFoldersList, false, context).iterator().toList()
当然在现实生活中,每页的最大项目数不应该是这样的任意数字。