使用两个子查询优化 OrientDB 中的 SQL 查询

Optimize SQL query in OrientDB with two sub-queries

假设有以下 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 个文件。

您是否尝试过 运行通过 EXPLAIN 查询? OrientDB 中有更多相关信息 文档.

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 任务之前会发生什么。