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

时间:2015-11-15 11:55:18

标签: xquery marklogic marklogic-8

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

对我来说,插入/添加1 M Person Entities使用MarkLogic XCC / .Net XQuery比使用SQL Server 2008 R2花费更多时间。在数据访问层中,SQL Server需要花费几分钟的时间,在11654毫秒内持续11秒。 MarkLogic 8在15分钟以上仍然忙于15621个实体!

我是NoSQL MarkLogic和XCC / XQuery的新手,可能做错了什么。 我可以在GitHub上找到我的MarkLogic测试代码:https://github.com/driekus77/DBTester/blob/master/DBTester/DataAccessLayer/Repository/MarkLogic/PersonRepository.cs#L48

可以在以下位置找到相应的SQLServer添加代码: https://github.com/driekus77/DBTester/blob/master/DBTester/DataAccessLayer/Repository/SQLServer/PersonRepository.cs#L64

那么我做错了什么?我应该直接使用MarkLogic RestAPI吗?我应该使用JSON代替XML吗?有没有办法加快我的XQuery Add调用?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

关系和文档以及“NoSQL”数据库的根本不同之处在于,这种比较最多只会产生误导。它们是不同的,因为它们专注于不同的问题和用例,并以不同的方式优化它们。 “经典”示例是基于GC,与引用计数和显式内存管理语言进行比较。例如。即使使用效率较低的算法,基于GC的应用程序也可以胜过较低级别的手动内存管理语言 - 仅仅因为GC可以延迟到应用程序的有趣部分 - 有时永远(应用程序在需要GC之前存在)。人们可以根据对你重要的事情来辩论这两方面。

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

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