- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试学习如何使用 RavenDB,为此我创建了一个基本示例。似乎初始化store和查询需要花费大量时间!
static void Main( string[] args )
{
const bool createNewEntities = true;
var sw = new Stopwatch();
using( var store = new EmbeddableDocumentStore {DataDirectory = "~\\Data"} )
{
sw.Start();
store.Initialize();
sw.Stop();
Console.WriteLine( "Initialized in {0} ms.", sw.ElapsedMilliseconds );
if (createNewEntities)
{
sw.Reset();
sw.Start();
using( var session = store.OpenSession() )
{
sw.Stop();
Console.WriteLine();
Console.WriteLine( "Opened session in {0} ms.", sw.ElapsedMilliseconds );
for( var i = 0; i < 10; i++ )
{
var entity = new EntityA( "Entity A " + DateTime.Now.ToLongTimeString() );
sw.Reset();
sw.Start();
session.Store( entity );
sw.Stop();
if (i < 3)
Console.WriteLine( "Stored '{0}' in {1} ms.", entity.Name, sw.ElapsedMilliseconds );
}
sw.Reset();
sw.Start();
session.SaveChanges();
sw.Stop();
Console.WriteLine( "Saved changes in {0} ms.", sw.ElapsedMilliseconds );
}
}
sw.Reset();
sw.Start();
using( var session = store.OpenSession() )
{
sw.Stop();
Console.WriteLine();
Console.WriteLine( "Opened EntityA session in {0} ms.", sw.ElapsedMilliseconds );
sw.Reset();
sw.Start();
var entities = session.Query<EntityA>().ToArray();
sw.Stop();
Console.WriteLine("Queried for all {0} EntityA in {1} ms.", entities.Length, sw.ElapsedMilliseconds);
}
sw.Reset();
sw.Start();
using( var session = store.OpenSession() )
{
sw.Stop();
Console.WriteLine();
Console.WriteLine( "Opened EntityA session (again) in {0} ms.", sw.ElapsedMilliseconds );
sw.Reset();
sw.Start();
var entities2 = session.Query<EntityA>().ToArray();
sw.Stop();
Console.WriteLine( "Queried (again) for all {0} EntityA in {1} ms.", entities2.Length, sw.ElapsedMilliseconds );
}
}
Console.WriteLine();
Console.WriteLine();
Console.WriteLine( "Press ENTER to exit..." );
Console.ReadLine();
}
这会产生以下输出:
Initialized in 6132 ms.Opened session in 3 ms.Stored 'Entity A 08:50:14' in 129 ms.Stored 'Entity A 08:50:15' in 0 ms.Stored 'Entity A 08:50:15' in 0 ms.Saved changes in 29 ms.Opened EntityA session in 0 ms.Queried for all 10 EntityA in 463 ms.Opened EntityA session (again) in 0 ms.Queried (again) for all 10 EntityA in 1 ms.
从这个粗略的例子中,我可以看出:
如何正确查询数据库中某种类型 (EntityA) 的所有文档?当然,RavenDB 不可能为每个查询都需要一个索引吗?尤其不适用于没有任何条件的查询?
(注意:我打算使用嵌入在桌面应用程序中的DB,其中列出所有文档用于显示DB的内容。)
最佳答案
以下是三个延迟的原因:
初始化延迟
初始化文档存储确实是最昂贵的操作之一。由于您正在运行 RavenDB 的嵌入式模式,它不仅需要建立与数据库的连接,而且实际上还需要启动数据库运行。在我的机器(一台 2.3Ghz i5 笔记本电脑)上,初始化需要 2516 毫秒。
如果您正在运行一个完整的 RavenDB 服务器(非嵌入式)——大部分延迟将发生在启动服务器本身时。初始化客户端会明显更快。
这是合理的行为,考虑到 IDocumentStore
(无论是嵌入的还是普通的)都应保持为单例。在您的应用程序中应该只有一个这样的实例,它应该在启动时创建并在关闭时处理。
首店延迟
因为您没有提供 Id
你自己的,Raven 会使用它的 HiLo generation algorithm 自动为你生成一个。 .这涉及从数据库中分配一个可分配的 id block ,这确实需要少量时间。后续调用会更快,因为在 block 用完之前它们不必访问数据库。
如果您自己提供 Id
属性并用有效标识符填充它,例如 entities/1
, entities/2
等 - 那么它会快得多,因为您将跳过 key 生成。
查询延迟
第一次调用.Query<T>()
当您未指定静态索引时,将尝试创建与查询表达式匹配的动态索引。即使在获取“所有”实体时也是如此,因为它仍然必须使用 Raven-Entity-Name
按实体类型进行过滤元数据。 Collections在 RavenDB 中是一个虚拟的东西,由元数据决定。这些文档实际上都在一起 - 因此除了通过元数据查询和过滤之外,没有其他方法可以将所有项目放入“集合”。
您看到的部分延迟是正在构建的动态索引。然后对项目进行索引会有延迟。请注意,如果您添加了更多项目(比如几百个),您仍然会得到大致相同的延迟,但您不会取回所有项目。索引会因为刚刚创建而过时,Raven 只会返回其中的一小部分。在像您这样的测试中,您可能希望明确等待 non-stale results。 .在实际应用程序中,您可能希望预定义一个 static index反而。实际上,您可以通过使用静态索引来加快查询速度。延迟将移至索引创建时间而不是查询时间。
如果你想完全避免使用索引,还有另一种方法:
session.Advanced.LoadStartingWith<EntityA>("EntityAs/");
此方法不使用元数据进行过滤 - 它使用键名本身。它无需查询就可以直接访问文档存储 - 所以速度要快得多。您将需要 paginate获得大量结果 - 但无论如何您都对查询有同样的担忧。但是使用这种方法,默认页面大小要小得多 (25) - 所以你迟早会遇到这种情况。
我希望这能解决您的疑虑。如果您还有其他的,请在评论中告诉我。
关于c# - 如何优化 RavenDB 查询以检索所有文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14786145/
我正在玩Raven DB几天,我想将其用作Web聊天应用程序的存储。我有包含一些用户数据和聊天记录的文档-这是大集合的聊天消息。 每次加载用户文档时,聊天记录也会加载,即使我只需要几个字段,例如:用户
我的实体是: class Resource { string Name; string EmployeeId; } 如何查询多名员工的资源?我尝试了这个: Resource[] Fin
我知道这篇文章的标题会让一些人感到畏缩。我自 2011 年 12 月以来一直在使用 RavenDB,并且逐渐意识到我以不适合使用文档数据库的方式对数据进行建模。首先,我完全明白这一点。其次,考虑到我目
考虑 2 个查询: var test1 = store.OpenSession().Query().Where(x => x.Id == 1).ToList(); var test2 =
我正在运行 RavenDB.Client 2.0.2173-Unstable。我正在创建一个 Multi-Tenancy 系统,作为我注册过程的一部分,我想创建一个新的 Raven 数据库。 我有三行
我正在使用在 Visual Studio 2010 中通过 NuGet 安装的嵌入式 RavenDB => RavenDB-Embedded.1.0.499 包。它正在我阅读完这篇优秀文章后开始的当前
我们在 AWS 上有一个带有集群 RavenDB 服务器 (5.23) 的 DotNet Core API (C#)。创建文档时,Id 具有不同的格式,具体取决于客户端。如果使用 Swagger/Po
我想知道取回搜索记录总数的最佳方法是什么,同时取回第 N 个 128 记录块数据段,这似乎是 RavenDb 运行时强加的上限。 例如给定这个查询,我还需要知道记录的总数。 var bookmarks
我使用的是 RavenDB 2.0.3.0 版。连接调试器后,涉及 RavenDB 的所有内容都运行得非常缓慢。每个查询需要几秒钟才能完成。 如果我在调试器坐在那里时按下暂停键,我总是看到它挂断了以下
我使用以下代码从 RavenDB 中删除文档。在 Raven UI 的底部,我可以看到文档数量从 3,000,000 减少到 2,000,000。但是“数据”文件的大小不会缩小。它总是大约100G。
我想在我的 Raven DB 中轮询新文档。推荐的方法是什么?我可以使用 IndexTimestamp 还是可以依赖文档的顺序? 我想我想分两步完成: 1.检查是否有新的东西,如果有: 1.1。获取最
我已经更改了我的数据模型,并且需要将所有对象的属性更改为 null,因为在我的模型更改后反序列化它们会引发异常。 我猜我可以为每个文档发布一个补丁,但我找不到任何方法来做到这一点,修补某种类型的每个文
有没有办法在进行空间搜索时从 RavenDB 获取距离计算值。我尝试转换建议的 _ = SpatialIndex.Generate(r.Latitude, r.Longitude) 至 距离 = Sp
是否有一种明智的方法来 stub /模拟调用 IDocumentSession.Query() 的结果? ? 我有一个命令,我想验证在对象上调用了方法(即正在测试的“单元”是命令,而不是命令编排的对象
我想在存储在 RavenDB 文档数据库中的两个实体之间有一个引用。由于这不是关系数据库,我知道我应该使用 RavenDBs 文档中描述的非规范化引用技术。虽然起初这看起来不错,但一旦我开始创建一个真
是否可以使用返回单个文档但不是关键的属性从数据存储加载(而不是查询)文档? 在我的场景中,我有用户和品牌。品牌是用户,但用户不一定是品牌。每个品牌都有一个 UserId 属性及其 Id。有没有办法通过
通过官方 RavenDB 阅读一个简单的问题 documentation ,我知道您可以使用客户端 API 函数执行这些操作,但不能使用 RQL,或者无论如何都可以使用 RQL 执行。 最佳答案 您正
我正尝试在 RavenDB 中检索我按 int 列表排序的文档。 Queryable = Queryable.OrderBy(dto => SearchIds.IndexOf(dto.Property
我刚刚让 RavenDB 开始工作。 我意识到我必须启动 RavenDB\packages\RavenDB.1.0.573\server.exe 才能通过以下方式在我的应用程序中访问它: Do
RavenDB 是否有众所周知的做法来检查 RavenDb 的可用性或检查它在任何给定时间的过载程度?我研究了一些 ravendb API 服务。好像没找到关于健康监测的。有没有像官方的 ravend
我是一名优秀的程序员,十分优秀!