通过两个子查询优化OrientDB中的SQL查询

时间:2019-07-18 18:31:10

标签: sql optimization subquery orientdb nexus

假定具有以下SQL查询:

select count(name)
from asset
where bucket in (
  select @RID
  from bucket
  where repository_name = 'some-release'
) and blob_updated < sysdate() - 17280000000


+----+-----+
|#   |count|
+----+-----+
|0   |90717|
+----+-----+

我发现存储库some-release中有多少个文件超过200天。我花了17.588秒。但是,以下查询(我想将200天转换为毫秒)为我提供了相同的输出,但需要83.93秒:

select count(name)
from asset
let $days = (
  select eval ( "200 * 24 * 60 * 60 * 1000" )
)
where bucket in (
  select @RID
  from bucket
  where repository_name = 'some-release'
) and blob_updated < sysdate() - first($days.eval)

为什么要花这么长时间以及如何对其进行优化?

存储库some-release包含255196个文件。

1 个答案:

答案 0 :(得分:0)

您是否尝试过通过EXPLAIN运行查询?在OrientDB documentation中有更多相关内容。

每个记录都会评估LET块,因此,如果您的some-release存储库中有很多资产(或过去拥有),这将大大缩短查询评估时间。为避免这种情况,您可以直接在WHERE子句中对其进行评估,即:

select count(name)
from asset
where bucket in (
  select @RID
  from bucket
  where repository_name = 'some-release'
) and blob_updated < sysdate() - eval('200 * 24 * 60 * 60 * 1000')

请问您要达到什么目标?您是否有机会摆脱一些旧资产?您可以为此设置Cleanup Policy

您可能希望压缩Blob存储,以减少不再需要的资产数量。在运行Admin - Compact blob store任务之前,请确保您了解会发生什么。