否SQL MarkLogic 插入实体 POCO 比 SQL Server 2008 慢得多?
NoSQL MarkLogic Inserting Entity POCO much slower than SQL Server 2008?
我正忙于创建一个带有数据访问层的简单 DBTester 程序,该程序可以测试和比较多个(某种)数据库。目前我已经为 SQL Server 和 MarkLogic NoSQL.
实现了 Add(Insert)
令我惊讶的是 inserting/adding 100 万个人实体使用 MarkLogic XCC/.Net XQuery 比使用 SQL Server 2008 R2 花费的时间要多得多。 SQL 服务器在数据访问层花费了几分钟,其中 11654 毫秒为 11 秒。 MarkLogic 8 在 15+ 分钟内仍然忙于 15621 个实体!
我是 NoSQL MarkLogic 和 XCC/XQuery 的新手,可能做错了什么。
我的 MarkLogic 测试代码可以在 GitHub: https://github.com/driekus77/DBTester/blob/master/DBTester/DataAccessLayer/Repository/MarkLogic/PersonRepository.cs#L48
找到
对应的SQL服务器添加代码可以在:
https://github.com/driekus77/DBTester/blob/master/DBTester/DataAccessLayer/Repository/SQLServer/PersonRepository.cs#L64
那我做错了什么?我应该直接使用 MarkLogic RestAPI 吗?我应该使用 JSON 而不是 XML 吗?有没有办法加快我的 XQuery 添加调用?
感谢您的帮助!
看我原来的评论。此外,我还注意到您正在将项目插入到单个 'persons' CML 文档中。这不是 MarkLogic 喜欢的。每个人都应该是一个单独的记录。否则,- 因为它是一个事务数据库,所以您的每个插入子调用都是阻塞的,因为它是同一个文档。
关系数据库和文档数据库以及 "NoSQL" 数据库根本不同,因此这种比较充其量只是一种误导。它们之所以不同,是因为它们专注于不同的问题和用例,并以不同的方式针对这些问题和用例进行优化。 'classic' 示例比较基于 GC、引用计数和显式内存管理语言。例如。基于 GC 的应用程序即使使用效率较低的算法也可以胜过较低级别的手动内存管理语言——仅仅是因为 GC 可以延迟到应用程序的有趣部分——有时永远(应用程序在需要 GC 之前就存在)。人们可以根据对您来说重要的事情来辩论双方。
我建议更有用的性能比较是总体应用程序响应能力或吞吐量,或者对您很重要的 'whole picture' 的某种度量,以及在针对特定用例和技术优化应用程序之后。如前所述,ML 所做的工作 'up front' 比关系或 'traditional' NoSQL 数据库要多得多。如果您的应用是 "WOM"(只写内存)用例,那么写入 /dev/null 会更快。
当需要进行复杂查询、文档创建、大型数据集等时,'up front' 已经完成,您的代码和服务器都不必如此努力地工作。与数据建模类似——如果您从为 RDBMS 优化的数据模型开始,它可能不适合非 RDBMS 引擎——反之亦然。
我建议首先从较小的数据集开始,然后完成整个应用的常见用例的 POC。数据模型是任何数据库和应用程序成功(或失败)的基础。从您的应用程序模型的角度来看, 'business objects' 'look like' 是什么?对于 NoSQL 类型的数据库,请尝试尽可能直接地对其进行建模。这将引导您朝着正确的方向发展,并 development/coding。在这一点上,性能测量和优化策略更有用和可比。
我正忙于创建一个带有数据访问层的简单 DBTester 程序,该程序可以测试和比较多个(某种)数据库。目前我已经为 SQL Server 和 MarkLogic NoSQL.
实现了 Add(Insert)令我惊讶的是 inserting/adding 100 万个人实体使用 MarkLogic XCC/.Net XQuery 比使用 SQL Server 2008 R2 花费的时间要多得多。 SQL 服务器在数据访问层花费了几分钟,其中 11654 毫秒为 11 秒。 MarkLogic 8 在 15+ 分钟内仍然忙于 15621 个实体!
我是 NoSQL MarkLogic 和 XCC/XQuery 的新手,可能做错了什么。 我的 MarkLogic 测试代码可以在 GitHub: https://github.com/driekus77/DBTester/blob/master/DBTester/DataAccessLayer/Repository/MarkLogic/PersonRepository.cs#L48
找到对应的SQL服务器添加代码可以在: https://github.com/driekus77/DBTester/blob/master/DBTester/DataAccessLayer/Repository/SQLServer/PersonRepository.cs#L64
那我做错了什么?我应该直接使用 MarkLogic RestAPI 吗?我应该使用 JSON 而不是 XML 吗?有没有办法加快我的 XQuery 添加调用?
感谢您的帮助!
看我原来的评论。此外,我还注意到您正在将项目插入到单个 'persons' CML 文档中。这不是 MarkLogic 喜欢的。每个人都应该是一个单独的记录。否则,- 因为它是一个事务数据库,所以您的每个插入子调用都是阻塞的,因为它是同一个文档。
关系数据库和文档数据库以及 "NoSQL" 数据库根本不同,因此这种比较充其量只是一种误导。它们之所以不同,是因为它们专注于不同的问题和用例,并以不同的方式针对这些问题和用例进行优化。 'classic' 示例比较基于 GC、引用计数和显式内存管理语言。例如。基于 GC 的应用程序即使使用效率较低的算法也可以胜过较低级别的手动内存管理语言——仅仅是因为 GC 可以延迟到应用程序的有趣部分——有时永远(应用程序在需要 GC 之前就存在)。人们可以根据对您来说重要的事情来辩论双方。
我建议更有用的性能比较是总体应用程序响应能力或吞吐量,或者对您很重要的 'whole picture' 的某种度量,以及在针对特定用例和技术优化应用程序之后。如前所述,ML 所做的工作 'up front' 比关系或 'traditional' NoSQL 数据库要多得多。如果您的应用是 "WOM"(只写内存)用例,那么写入 /dev/null 会更快。 当需要进行复杂查询、文档创建、大型数据集等时,'up front' 已经完成,您的代码和服务器都不必如此努力地工作。与数据建模类似——如果您从为 RDBMS 优化的数据模型开始,它可能不适合非 RDBMS 引擎——反之亦然。
我建议首先从较小的数据集开始,然后完成整个应用的常见用例的 POC。数据模型是任何数据库和应用程序成功(或失败)的基础。从您的应用程序模型的角度来看, 'business objects' 'look like' 是什么?对于 NoSQL 类型的数据库,请尝试尽可能直接地对其进行建模。这将引导您朝着正确的方向发展,并 development/coding。在这一点上,性能测量和优化策略更有用和可比。