У меня есть база данных OrientDB с около 300 миллионами записей класса «А расширяет V».
Каждая запись имеет свойство 'x' (LONG), для которого я построил индекс (NOTUNIQUE).
Я сейчас пытаюсь получить доступ к записям, где 'x> 0' из моего кода C #:
SELECT * FROM A WHERE x > 0
Поскольку это было слишком много для жестко заданного времени ожидания сокета .NET-бинарного соединителя (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, позволяющий избежать этой проблемы с тайм-аутом, кроме увеличения энергопотребления процессора и ускорения его хранения?
Заранее спасибо!