我有一个OrientDB数据库,其中包含约3亿个“ A扩展V”类记录。 每个记录都有一个属性'x'(LONG),我为(NOTUNIQUE)建立了一个索引。
我现在正在尝试访问C#代码中“ x> 0”的记录:
SELECT * FROM A WHERE x > 0
因为这对.NET-binary连接器的硬编码套接字超时(30秒)造成了很大的影响,所以我尝试使用分页来限制结果集和查询时间:
SELECT * FROM A WHERE @rid > <skip> AND x > 0 LIMIT 10000
我想不出接收下一次迭代的正确方法(我只需要搜索最后一条记录的@rid,只获取匹配的@rids),然后再次遇到超时错误(第一个查询耗时约4秒,第二个查询耗时5秒,第三个查询耗时6秒,很快增加到30秒以上,导致超时。这可能是因为我的代码是无意间设计的,以扫描未命中的第一个连续序列,然后无法增加跳跃:
using (var db = new ODatabase("localhost", 2424, "testgraph", ODatabaseType.Graph, "root", "<some password>"))
{
var skip = new ORID();
var limit = 20000;
var records = db.Command($"SELECT * FROM A WHERE @rid > {skip} AND x > 0 LIMIT {limit}").ToList();
while (records.Count > 0)
{
// problem is here
skip = new ORID(records.Last().ORID);
foreach (var record in records)
{
// do awesome stuff
}
records = db.Command($"SELECT * FROM A WHERE @rid > {skip} AND x > 0 LIMIT {limit}").ToList();
}
}
是否有任何方法可以检索x> 0的记录,而不是浪费更多的CPU能力并加快存储速度,从而避免出现此超时问题?
谢谢!