Xquery NoSQL MarkLogic插入实体POCO比SQL Server 2008慢得多?

Xquery NoSQL MarkLogic插入实体POCO比SQL Server 2008慢得多?,xquery,marklogic,marklogic-8,Xquery,Marklogic,Marklogic 8,我正忙着创建一个简单的DBTester程序,它有一个数据访问层,可以测试和比较多个(某种)数据库。目前,我已经为SQL Server和MarkLogic NoSQL实现了添加(插入)功能 对于我的支持,使用MarkLogic XCC/.Net XQuery插入/添加100万个人实体比使用SQL Server 2008 R2花费的时间多得多。在数据访问层,SQL Server需要几分钟,其中11654毫秒需要11秒。MarkLogic 8仍在15分钟内忙着处理15621个实体 我不熟悉NoSQL

我正忙着创建一个简单的DBTester程序,它有一个数据访问层,可以测试和比较多个(某种)数据库。目前,我已经为SQL Server和MarkLogic NoSQL实现了添加(插入)功能

对于我的支持,使用MarkLogic XCC/.Net XQuery插入/添加100万个人实体比使用SQL Server 2008 R2花费的时间多得多。在数据访问层,SQL Server需要几分钟,其中11654毫秒需要11秒。MarkLogic 8仍在15分钟内忙着处理15621个实体

我不熟悉NoSQL MarkLogic和XCC/XQuery,可能做错了什么。 我的MarkLogic测试代码可以在GitHub上找到:

相应的SQLServer添加代码可在以下位置找到:

那么我做错了什么?我应该直接使用MarkLogic RestAPI吗?我应该使用JSON而不是XML吗?有没有办法加速我的XQuery添加调用


谢谢你的帮助

请参阅我的原始评论。此外,我还注意到,您正在将项目插入单个“人员”CML文档中。这不是MarkLogic喜欢的。每个人都应该是一个单独的记录。否则,-因为它是一个事务性数据库,所以每个insert子调用都会被阻塞,因为它是同一个文档。

请参阅我的原始注释。此外,我还注意到,您正在将项目插入单个“人员”CML文档中。这不是MarkLogic喜欢的。每个人都应该是一个单独的记录。否则,-因为它是一个事务数据库,所以每个insert子调用都是阻塞的,因为它是同一个文档。

关系数据库和文档数据库以及“NoSQL”数据库完全不同,这样的比较充其量只是误导。它们是不同的,因为它们关注不同的问题和用例,并以不同的方式针对这些问题和用例进行优化。一个“经典”的例子是比较基于GC、引用计数和显式内存管理语言。例如,基于GC的应用程序,即使使用效率较低的算法,其性能也可能优于较低级别的手动内存管理语言——这仅仅是因为GC可以延迟到应用程序的感兴趣部分之后——有时是永远的(应用程序在需要GC之前就已经存在)。根据对你来说什么是重要的,你可以对这两方面进行辩论

我建议更有用的性能比较是应用程序的总体响应能力,或吞吐量,或对您很重要的“整体情况”的某种度量,以及针对特定用例和技术优化应用程序之后的性能比较。如前所述,ML比关系型或“传统”NoSQL数据库做的“前期”工作要多得多。如果您的应用程序是“WOM”(只写内存)用例,那么写入/dev/null将更快。 当需要进行复杂的查询、文档创建、大型数据集等工作时,“预先”已经完成了,您的代码和服务器都不需要如此努力。与数据建模类似——如果您从为RDBMS优化的数据模型开始,它可能不适合非RDBMS引擎,反之亦然


我建议首先从一组较小的数据开始,然后从整个应用程序的通用用例的POC开始。数据模型是任何数据库和应用程序成功(或失败)的基础。从应用程序模型的角度来看,“业务对象”看起来像什么?对于NoSQL类型的DB,尝试尽可能直接地建模。这将引导您在性能和开发/编码方面走向正确的方向。在这一点上,性能度量和优化策略更有用,更具可比性。

关系数据库、文档数据库和“NoSQL”数据库完全不同,这种比较充其量只是误导。它们是不同的,因为它们关注不同的问题和用例,并以不同的方式针对这些问题和用例进行优化。一个“经典”的例子是比较基于GC、引用计数和显式内存管理语言。例如,基于GC的应用程序,即使使用效率较低的算法,其性能也可能优于较低级别的手动内存管理语言——这仅仅是因为GC可以延迟到应用程序的感兴趣部分之后——有时是永远的(应用程序在需要GC之前就已经存在)。根据对你来说什么是重要的,你可以对这两方面进行辩论

我建议更有用的性能比较是应用程序的总体响应能力,或吞吐量,或对您很重要的“整体情况”的某种度量,以及针对特定用例和技术优化应用程序之后的性能比较。如前所述,ML比关系型或“传统”NoSQL数据库做的“前期”工作要多得多。如果您的应用程序是“WOM”(只写内存)用例,那么写入/dev/null将更快。 当需要进行复杂的查询、文档创建、大型数据集等工作时,“预先”已经完成了,您的代码和服务器都不需要如此努力。与数据建模类似——如果您从为RDBMS优化的数据模型开始,它可能不适合非RDBMS引擎,反之亦然


我建议首先从一组较小的数据开始,然后从整个应用程序的通用用例的POC开始。数据模型是任何数据库和应用程序成功(或失败)的基础。从应用程序模型的角度来看,“业务对象”看起来像什么?对于NoSQL类型的DB,尝试尽可能直接地建模。这将引导您在性能和开发/编码方面走向正确的方向。在这一点上,性能度量和优化策略更有用、更具可比性。

我不是在回答这个问题,因为深入研究您的代码需要相当长的时间。然而,值得注意的是,在MarkLogic中,默认情况下,您正在进行事务处理、词干分析,您正在以各种方式为每个元素编制索引,包括类似db的选择以及一些漂亮的选择