RavenDB низкая производительность select

Я тестирую RavenDB для своих будущих проектов. Производительность базы данных является обязательным требованием для меня, поэтому я хочу иметь возможность настроить RavenDB, чтобы быть по крайней мере в диапазоне производительности SQL Server, но мои тесты показывают, что raven db примерно в 10x-20x раз медленнее в select запросах, чем SQL Server, даже когда RavenDB индексирован, а SQL Server не имеет никаких индексов.

Я заполнил базу данных 150 тысячами документов. Каждый документ имеет коллекцию дочерних элементов. Размер базы данных составляет около 1 ГБ, размер индекса тоже. 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 (не знаю, влияет ли это отрицательно/положительно на производительность).

Этот запрос занимает от 500 мс до 1500 мс (обратите внимание, что это время, необходимое для выполнения запроса, показанное непосредственно из консоли ravendb. Таким образом, оно не содержит времени http-запроса и накладных расходов на десериализацию. Только время выполнения запроса).

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

Я выполняю запрос на четырехъядерном процессоре i5, работающем на частоте 4,2 ГГц, а база данных находится на SSD.

Теперь, когда я поместил тот же объем данных на sql server express, с той же схемой и тем же количеством связанных объектов. без индекса, sql server выполняет тот же запрос, включающий джойны, за 35 мс. С индексом это занимает 0 мс :|.

Все тесты проводились при разогретых db-серверах.

Хотя я все еще очень доволен производительностью 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");
    }
}

error CS1977: Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

8
задан bmargulies 17 January 2013 в 20:42
поделиться