Как эффективно извлечь каждый N-й объект из DB4O, упорядоченного по проиндексированному полю - PullRequest
1 голос
/ 24 августа 2011

Я храню много событий в базе данных DB4O. События помечены временем, и я проиндексировал поле. Получение (перечислитель) всех событий, упорядоченных по метке времени, почти не занимает времени (так как они не активированы). Тем не менее, что если я захочу выходить на пенсию каждые 10 лет, я могу сделать цикл, но тогда мне придется подсчитать, что занимает значительное время. Даже возвращение FirstOrDefault () из Enumerable (да, я в C # и LINQ) занимает время. Если поле проиндексировано, не должно ли быть довольно легко найти первое в упорядоченном наборе?

Да, у меня нет большого опыта использования DB4O, но приложение, которое я написал, работает хорошо. Обычно я отправляю миллионы событий в базу данных, а затем извлекаю несколько событий за короткий промежуток времени. Нет проблем, и приложение работает очень хорошо. Время ответа для типичного запроса составляет менее 100 мс.

Теперь я хочу получить образец всех событий. Каждые десять или около того ... Как мне это сделать?

1 Ответ

1 голос
/ 25 августа 2011

Вы используете LINQ правильно, знаете? Вы уверены, что запрос не займет много времени? Потому что запросы LINQ выполняются при запуске итерации по нему. Не раньше.

Также обратите внимание, что db4o не использует индекс для сортировки прямо сейчас. Это означает, что для огромных наборов результатов сортировка будет медленной.

FirstOrDefault () уже занимает много времени? Там может быть две причины. Либо это занимает время, потому что запрос выполняется там. Или потому что db4o нужно время, чтобы активировал объект . Это очень сложный объект. Я думаю, что время запроса может быть проблемой, потому что вы сказали, что операция .Count () занимает свое время.

Теперь вы хотите получить только каждый 10-й объект. Ну, я считаю, что оператор .ElementAt () еще не был реализован в оптимизированной форме для db4o. Это означает, что он активирует каждый объект между ними. В последнем выпуске db4o .Skip () не должен активировать каждый промежуточный объект. Таким образом, вы можете перейти к нужной позиции и использовать там. .FirstOrDefault ().

...