C# 为什么SQL Server 2012在此查询中比MongoDB快

C# 为什么SQL Server 2012在此查询中比MongoDB快,c#,sql-server,mongodb,sql-server-2012,C#,Sql Server,Mongodb,Sql Server 2012,我正在SQL Server 2012和MongoDB 2.4.9之间进行一些性能测试。我在网上做了一些研究,发现许多比较只比较了这两个数据库之间的insert性能。我只对没有索引的selectperformance感兴趣。我设置了一个非常简单的测试。这是规格 SQL Server安装程序 仅使用一个整数字段设置SQL Server。 插入100万个随机整数 MongoDB设置 有两个字段_id和id1 在id1字段中插入100万个随机整数 当我在两个数据库中插入数字时,它们是完全相同的数字。随机

我正在SQL Server 2012和MongoDB 2.4.9之间进行一些性能测试。我在网上做了一些研究,发现许多比较只比较了这两个数据库之间的insert性能。我只对没有索引的selectperformance感兴趣。我设置了一个非常简单的测试。这是规格

SQL Server安装程序

仅使用一个整数字段设置SQL Server。 插入100万个随机整数 MongoDB设置

有两个字段_id和id1 在id1字段中插入100万个随机整数 当我在两个数据库中插入数字时,它们是完全相同的数字。随机数的范围从1到1000

SQL Server查询

MongoDB查询

结果:

SQL Server:192毫秒 MongoDB:1109毫秒
对于我的模式,我不需要任何连接,只需要非规范化数据——这就是我考虑MongoDB的原因。在线阅读基准测试后,我预计mongoDB的速度会比SQL Server快很多倍。我有什么地方做错了吗?同样,我希望在没有索引的情况下进行测试。

在这种情况下,MongoDB的速度可能要慢五倍,因为它需要读取和输出五倍的数据

SQL表中的一行只有4字节。但在MongoDB中,它是一个4字节的整数加上一个12字节的ObjectId。此外,字段名也是每个单独文档的一部分。字符串_id和id1是您检索的每个文档的一部分,因此会添加一些额外的字节

这就是实际的有效载荷。查看时,您可以看到您的文档由以下内容表示:

32位整数为4字节,即文档的总长度 1字节0x01现在是ObjectId 4个字节用于以null结尾的字符串\u id ObjectId为12字节 1字节0x10现在是一个32位的整数,它是最小的整数 以null结尾的字符串id1有4个字节 32位整数为4字节 1尾随0x00,用于标记文档的结尾
总共31个字节。

不等式太多。为什么架构不同?如何度量sql server查询?你看到结果了吗?mongo db查询中的值是什么类型的?你为什么要重复这些结果?等等…表上有索引吗?我使用StopWatch类来度量这两个查询。MongoDB中只有整数,id:object,id1:integer。我循环使用sql server和MongoDB。这两个查询只有大约600个结果。你认为循环会影响它吗?你的问题太广泛了,无法回答。。。变量太多了。RAM、磁盘、CPU、网络等。查询是否真的代表了真实的东西?如果我关心实际的最佳性能,我会将其存储到磁盘,并在这两种情况下对其进行索引。最近与MongoDB和其他选项进行了一些性能比较。。。这通常不是最快或最好的选择。这取决于很多因素。对不起,如果你认为这是热-我只是认为这是太广泛,因为你试图比较两个非常不同的数据库技术,没有解释太多,没有使用任何一个必要的,因为它应该使用。例如,在我的电脑上进行相同的测试,完全在内存中完成需要2毫秒:啊..那会让我很高兴的。我将修改我的测试以解决这个问题。因此,每行至少有12字节加上额外的内存fields@IvanJuarez加上4个字节表示文档的总长度,1个字节表示类型指示符0x07这是一个objectID,4个字节表示键名_idNULL终止字符串,然后是12个字节的objectID,最后,文档末尾的尾随0x00为1字节,因此最小文档至少需要22字节。有关更多信息:
select id from a101 where id > 995
var q = Query.GT("id1", 995);        
foreach (var i in collection.Find(q))
{
     values.Add(i.id1);
}