0

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

令我惊讶的是,使用 MarkLogic XCC/.Net XQuery 插入/添加 1 M 个人实体比使用 SQL Server 2008 R2 花费更多的时间。SQL Server 在数据访问层中需要几分钟,其中 11 秒在 11654 毫秒内。MarkLogic 8 在 15 分钟内仍然忙于 15621 个实体!

我是 NoSQL MarkLogic 和 XCC/XQuery 的新手,可能做错了什么。我的 MarkLogic 测试代码可以在 GitHub 上找到: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 调用?

谢谢你的帮助!

4

2 回答 2

3

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

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

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

于 2015-11-16T00:59:01.930 回答
3

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

于 2015-11-15T14:44:42.853 回答