RavenDB糟糕的选择表现

我正在为未来的项目测试RavenDB。 数据库性能是我必须要求的,这就是为什么我希望能够将RavenDB至少调整到SQL Server的性能范围,但是我的测试表明,在选择查询中,raven db比SQL Server慢大约10倍-20倍,甚至当RavenDB被索引并且SQL Server没有任何索引时。

我用150k文件填充数据库。 每个文档都有一组子元素。 Db大小约为。 1GB,索引尺寸也是如此。 Raven / Esent / CacheSizeMax设置为2048,Raven / Esent / MaxVerPages设置为128.以下是文档的外观:

{
  "Date": "2028-09-29T01:27:13.7981628",
  "Items": [
    {
      {
      "ProductId": "products/673",
      "Quantity": 26,
      "Price": {
        "Amount": 2443.0,
        "Currency": "USD"
      }
    },
    {
      "ProductId": "products/649",
      "Quantity": 10,
      "Price": {
        "Amount": 1642.0,
        "Currency": "USD"
      }
    }
  ],
  "CustomerId": "customers/10"
}


public class Order
{
    public DateTime Date { get; set; }
    public IList<OrderItem> Items { get; set; }
    public string CustomerId { get; set; }
}

public class OrderItem
{
    public string ProductId { get; set; }
    public int Quantity { get; set; }
    public Price Price { get; set; }
}

public class Price
{
    public decimal Amount { get; set; }
    public string Currency { get; set; }
}

这是定义的索引:

from doc in docs.Orders
from docItemsItem in ((IEnumerable<dynamic>)doc.Items).DefaultIfEmpty()
select new { Items_Price_Amount = docItemsItem.Price.Amount, Items_Quantity = docItemsItem.Quantity, Date = doc.Date }

我使用Management Studio定义了索引,而不是从代码BTW(不知道它是否对性能有负面/正面影响)。

这个查询从500ms到1500ms完成(请注意,这是执行查询所需的时间,直接从ravendb的控制台显示,因此它不包含http请求时间和反序列化开销,只是查询执行时间)。

session.Query<Order>("OrdersIndex").Where(o =>
    o.Items.Any(oi => oi.Price.Amount > 0 && oi.Quantity < 100)).Take(128).ToList();

我在运行在4.2 GHz的四核i5 cpu上运行查询,而数据库位于SSD上。

现在,当我在sql server express上填充相同数量的数据时,具有相同的模式和相同数量的关联对象。 没有索引,sql服务器执行包含35ms连接的相同查询。 使用索引需要0ms:|。

所有测试都是在数据库服务器预热时执行的。

尽管如此,我仍然对RavenDB的表现非常满意,如果我缺少某些东西或者RavenDB比关系数据库慢,我很好奇。 对不起,我英文很差。

谢谢

UPDATE

Ayande,我尝试了你的建议,但是当我尝试定义发送给我的索引时,出现以下错误:

public Index_OrdersIndex()
    {
        this.ViewText = @"from doc in docs.Orders
select new { Items_Price_Amount = doc.Items(s=>s.Price.Amount), Items_Quantity = doc.Items(s=>s.Quantity), Date = doc.Date }
";
        this.ForEntityNames.Add("Orders");
        this.AddMapDefinition(docs => from doc in docs
            where doc["@metadata"]["Raven-Entity-Name"] == "Orders"
            select new { Items_Price_Amount = doc.Items(s => s.Price.Amount), Items_Quantity = doc.Items.(s => s.Quantity), Date = doc.Date, __document_id = doc.__document_id });
        this.AddField("Items_Price_Amount");
        this.AddField("Items_Quantity");
        this.AddField("Date");
        this.AddField("__document_id");
        this.AddQueryParameterForMap("Date");
        this.AddQueryParameterForMap("__document_id");
        this.AddQueryParameterForReduce("Date");
        this.AddQueryParameterForReduce("__document_id");
    }
}

错误CS1977:不能将lambda表达式用作动态分派操作的参数,而无需先将其转换为委托或表达式树类型


Davita,以下索引产生800万条索引条目:

from doc in docs.Orders
from docItemsItem in ((IEnumerable<dynamic>)doc.Items).DefaultIfEmpty()
select new { Items_Price_Amount = docItemsItem.Price.Amount, Items_Quantity = docItemsItem.Quantity, Date = doc.Date }

这个产生的少得多:

from doc in docs.Orders
select new { Items_Price_Amount = doc.Items(s=>s.Price.Amount), Items_Quantity = doc.Items.(s=>s.Quantity), Date = doc.Date }

可以用相同的结果来查询,但是在我们的测试中显示速度大约快两倍。

主要的问题是你正在做几个范围查询,这些查询对于大量的潜在值是很昂贵的,然后你有大量的查询实际匹配。

顺便说一句,精确匹配速度要快得多。

我们仍在努力尝试加快速度。

链接地址: http://www.djcxy.com/p/62017.html

上一篇: RavenDB poor select performance

下一篇: 'zinnia